From 0c7df5fef314e451cac57521b10e5f34cc269d92 Mon Sep 17 00:00:00 2001 From: Andrey Epin Date: Thu, 6 Oct 2022 18:40:29 -0700 Subject: Simplify SelectableTargetInfo dependencies MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove “functional” (Context, PackageManager, and SelectableTargetInfoCommunicator) and obsolete dependencies from SelectableTargetInfo. Changes to SelectableTargetInfo: 1. Fields mBadgeIcon, mBadgeContentDescriptor were never read and thus removed. 2. Values previously provided by SelectableTargetInfoCommunicator are inlined or pre-calculated: - getTargetIntent() used in the resolved intent calculation replaced with a pre-calculated resolved intent value (we can do it as target intent does not change); - getReferrerFillInIntent() passed as an argument (we can do it as the value does not change). 3. As ChooserListAdapter.LoadDirectShareIconTask was the only place that invoked SelectableTargetInfo#loadIcon(), icon loading logic, SelectableTargetInfo#getChooserTargetIconDrawable method, is moved over there and the related code is deleted from SelectableTargetInfo. 4. SelectableTargetInfo.SelectableTargetInfoCommunicator #makePresentatinGetter() removed as not used. Changes to TargetInfo (and related classes): 1. TargetInfo#setDrawableIcon() is added to the interface as a way for ChooserListAdapter#LoadDirectShareIconTask to update the icon. 2. NotSelectableTargetInfo#newPlaceHolderInfo() changed to receive a context that would be used by the target it creates. 3. After the aforementioned changes no implementation of the TargetInfo#getDisplayIcon actually uses its Context argument, thus it is deleted. 4. A default implementation added for TargetInfo#hasDisplayIcon method as all implementations, essentially, were the same. 5. TargetInfo#loadIcon removed as not used. Fix: 257285229 Test: manual functinality test Test: atest IntentResolverUnitTests Change-Id: I448ebed9c5346092ebca6c4e356830c55288d55b --- .../intentresolver/ChooserListAdapterTest.kt | 31 ++++------ .../intentresolver/ShortcutSelectionLogicTest.kt | 28 +++++---- .../intentresolver/chooser/TargetInfoTest.kt | 72 ++++++++++++++++------ 3 files changed, 81 insertions(+), 50 deletions(-) (limited to 'java/tests/src') diff --git a/java/tests/src/com/android/intentresolver/ChooserListAdapterTest.kt b/java/tests/src/com/android/intentresolver/ChooserListAdapterTest.kt index 6ca7c5d1..c43b014c 100644 --- a/java/tests/src/com/android/intentresolver/ChooserListAdapterTest.kt +++ b/java/tests/src/com/android/intentresolver/ChooserListAdapterTest.kt @@ -17,10 +17,9 @@ package com.android.intentresolver import android.content.ComponentName +import android.content.Intent import android.content.pm.PackageManager import android.content.pm.PackageManager.ResolveInfoFlags -import android.os.Bundle -import android.service.chooser.ChooserTarget import android.view.View import android.widget.FrameLayout import android.widget.ImageView @@ -71,7 +70,7 @@ class ChooserListAdapterTest { chooserActivityLogger, ) { override fun createLoadDirectShareIconTask( - info: TargetInfo? + info: SelectableTargetInfo ): LoadDirectShareIconTask = taskProvider(info) } @@ -122,22 +121,16 @@ class ChooserListAdapterTest { private fun createSelectableTargetInfo(): TargetInfo = SelectableTargetInfo.newSelectableTargetInfo( - context, - null, - createChooserTarget(), - 1f, - selectableTargetInfoCommunicator, - null, - null - ) - - private fun createChooserTarget(): ChooserTarget = - ChooserTarget( - "Title", - null, - 1f, - ComponentName("package", "package.Class"), - Bundle() + /* sourceInfo = */ mock(), + /* backupResolveInfo = */ mock(), + /* resolvedIntent = */ Intent(), + /* chooserTarget = */ createChooserTarget( + "Target", 0.5f, ComponentName("pkg", "Class"), "id-1" + ), + /* modifiedScore = */ 1f, + /* shortcutInfo = */ createShortcutInfo("id-1", ComponentName("pkg", "Class"), 1), + /* appTarget */ null, + /* referrerFillInIntent = */ Intent() ) private fun createView(): View { diff --git a/java/tests/src/com/android/intentresolver/ShortcutSelectionLogicTest.kt b/java/tests/src/com/android/intentresolver/ShortcutSelectionLogicTest.kt index 8581ed0c..2c56e613 100644 --- a/java/tests/src/com/android/intentresolver/ShortcutSelectionLogicTest.kt +++ b/java/tests/src/com/android/intentresolver/ShortcutSelectionLogicTest.kt @@ -18,11 +18,10 @@ package com.android.intentresolver import android.content.ComponentName import android.content.Context -import android.content.Intent import android.content.pm.ShortcutInfo import android.service.chooser.ChooserTarget import com.android.intentresolver.chooser.TargetInfo -import com.android.intentresolver.chooser.SelectableTargetInfo.SelectableTargetInfoCommunicator +import androidx.test.filters.SmallTest import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue import org.junit.Test @@ -31,6 +30,7 @@ private const val PACKAGE_A = "package.a" private const val PACKAGE_B = "package.b" private const val CLASS_NAME = "./MainActivity" +@SmallTest class ShortcutSelectionLogicTest { private val packageTargets = HashMap>().apply { arrayOf(PACKAGE_A, PACKAGE_B).forEach { pkg -> @@ -68,7 +68,8 @@ class ShortcutSelectionLogicTest { /* directShareToShortcutInfos = */ emptyMap(), /* directShareToAppTargets = */ emptyMap(), /* userContext = */ mock(), - /* mSelectableTargetInfoCommunicator = */ mock(), + /* targetIntent = */ mock(), + /* refererFillInIntent = */ mock(), /* maxRankedTargets = */ 4, /* serviceTargets = */ serviceResults ) @@ -99,7 +100,8 @@ class ShortcutSelectionLogicTest { /* directShareToShortcutInfos = */ emptyMap(), /* directShareToAppTargets = */ emptyMap(), /* userContext = */ mock(), - /* mSelectableTargetInfoCommunicator = */ mock(), + /* targetIntent = */ mock(), + /* refererFillInIntent = */ mock(), /* maxRankedTargets = */ 4, /* serviceTargets = */ serviceResults ) @@ -130,7 +132,8 @@ class ShortcutSelectionLogicTest { /* directShareToShortcutInfos = */ emptyMap(), /* directShareToAppTargets = */ emptyMap(), /* userContext = */ mock(), - /* mSelectableTargetInfoCommunicator = */ mock(), + /* targetIntent = */ mock(), + /* refererFillInIntent = */ mock(), /* maxRankedTargets = */ 1, /* serviceTargets = */ serviceResults ) @@ -163,7 +166,8 @@ class ShortcutSelectionLogicTest { /* directShareToShortcutInfos = */ emptyMap(), /* directShareToAppTargets = */ emptyMap(), /* userContext = */ mock(), - /* mSelectableTargetInfoCommunicator = */ mock(), + /* targetIntent = */ mock(), + /* refererFillInIntent = */ mock(), /* maxRankedTargets = */ 4, /* serviceTargets = */ serviceResults ) @@ -175,7 +179,8 @@ class ShortcutSelectionLogicTest { /* directShareToShortcutInfos = */ emptyMap(), /* directShareToAppTargets = */ emptyMap(), /* userContext = */ mock(), - /* mSelectableTargetInfoCommunicator = */ mock(), + /* targetIntent = */ mock(), + /* refererFillInIntent = */ mock(), /* maxRankedTargets = */ 4, /* serviceTargets = */ serviceResults ) @@ -211,7 +216,8 @@ class ShortcutSelectionLogicTest { ), /* directShareToAppTargets = */ emptyMap(), /* userContext = */ mock(), - /* mSelectableTargetInfoCommunicator = */ mock(), + /* targetIntent = */ mock(), + /* refererFillInIntent = */ mock(), /* maxRankedTargets = */ 4, /* serviceTargets = */ serviceResults ) @@ -234,9 +240,6 @@ class ShortcutSelectionLogicTest { /* maxShortcutTargetsPerApp = */ 1, /* applySharingAppLimits = */ true ) - val targetInfoCommunicator = mock { - whenever(targetIntent).thenReturn(Intent()) - } val context = mock { whenever(packageManager).thenReturn(mock()) } @@ -249,7 +252,8 @@ class ShortcutSelectionLogicTest { /* directShareToShortcutInfos = */ emptyMap(), /* directShareToAppTargets = */ emptyMap(), /* userContext = */ context, - /* mSelectableTargetInfoCommunicator = */ targetInfoCommunicator, + /* targetIntent = */ mock(), + /* refererFillInIntent = */ mock(), /* maxRankedTargets = */ 4, /* serviceTargets = */ serviceResults ) diff --git a/java/tests/src/com/android/intentresolver/chooser/TargetInfoTest.kt b/java/tests/src/com/android/intentresolver/chooser/TargetInfoTest.kt index ae9c0f8d..11837e08 100644 --- a/java/tests/src/com/android/intentresolver/chooser/TargetInfoTest.kt +++ b/java/tests/src/com/android/intentresolver/chooser/TargetInfoTest.kt @@ -18,16 +18,16 @@ package com.android.intentresolver.chooser import android.app.prediction.AppTarget import android.app.prediction.AppTargetId +import android.content.ComponentName import android.content.Intent -import android.content.pm.ShortcutInfo +import android.content.pm.ActivityInfo +import android.content.pm.ResolveInfo import android.os.UserHandle -import android.service.chooser.ChooserTarget import androidx.test.platform.app.InstrumentationRegistry import com.android.intentresolver.createChooserTarget import com.android.intentresolver.createShortcutInfo import com.android.intentresolver.mock import com.android.intentresolver.ResolverDataProvider -import com.android.intentresolver.chooser.SelectableTargetInfo.SelectableTargetInfoCommunicator import com.google.common.truth.Truth.assertThat import org.junit.Test @@ -40,12 +40,12 @@ class TargetInfoTest { assertThat(info.isEmptyTargetInfo()).isTrue() assertThat(info.isChooserTargetInfo()).isTrue() // From legacy inheritance model. assertThat(info.hasDisplayIcon()).isFalse() - assertThat(info.getDisplayIcon(context)).isNull() + assertThat(info.getDisplayIcon()).isNull() } @Test fun testNewPlaceholderTargetInfo() { - val info = NotSelectableTargetInfo.newPlaceHolderTargetInfo() + val info = NotSelectableTargetInfo.newPlaceHolderTargetInfo(context) assertThat(info.isPlaceHolderTargetInfo()).isTrue() assertThat(info.isChooserTargetInfo()).isTrue() // From legacy inheritance model. assertThat(info.hasDisplayIcon()).isTrue() @@ -57,33 +57,67 @@ class TargetInfoTest { val displayInfo: DisplayResolveInfo = mock() val chooserTarget = createChooserTarget( "title", 0.3f, ResolverDataProvider.createComponentName(1), "test_shortcut_id") - val selectableTargetInfoCommunicator: SelectableTargetInfoCommunicator = mock() val shortcutInfo = createShortcutInfo("id", ResolverDataProvider.createComponentName(2), 3) val appTarget = AppTarget( AppTargetId("id"), - chooserTarget.getComponentName().getPackageName(), - chooserTarget.getComponentName().getClassName(), + chooserTarget.componentName.packageName, + chooserTarget.componentName.className, UserHandle.CURRENT) + val resolvedIntent = mock() val targetInfo = SelectableTargetInfo.newSelectableTargetInfo( - context, displayInfo, + mock(), + resolvedIntent, chooserTarget, 0.1f, - selectableTargetInfoCommunicator, shortcutInfo, - appTarget) - assertThat(targetInfo.isSelectableTargetInfo()).isTrue() - assertThat(targetInfo.isChooserTargetInfo()).isTrue() // From legacy inheritance model. - assertThat(targetInfo.getDisplayResolveInfo()).isSameInstanceAs(displayInfo) - assertThat(targetInfo.getChooserTargetComponentName()) - .isEqualTo(chooserTarget.getComponentName()) - assertThat(targetInfo.getDirectShareShortcutId()).isEqualTo(shortcutInfo.getId()) - assertThat(targetInfo.getDirectShareShortcutInfo()).isSameInstanceAs(shortcutInfo) - assertThat(targetInfo.getDirectShareAppTarget()).isSameInstanceAs(appTarget) + appTarget, + mock(), + ) + assertThat(targetInfo.isSelectableTargetInfo).isTrue() + assertThat(targetInfo.isChooserTargetInfo).isTrue() // From legacy inheritance model. + assertThat(targetInfo.displayResolveInfo).isSameInstanceAs(displayInfo) + assertThat(targetInfo.chooserTargetComponentName).isEqualTo(chooserTarget.componentName) + assertThat(targetInfo.directShareShortcutId).isEqualTo(shortcutInfo.id) + assertThat(targetInfo.directShareShortcutInfo).isSameInstanceAs(shortcutInfo) + assertThat(targetInfo.directShareAppTarget).isSameInstanceAs(appTarget) + assertThat(targetInfo.resolvedIntent).isSameInstanceAs(resolvedIntent) // TODO: make more meaningful assertions about the behavior of a selectable target. } + @Test + fun test_SelectableTargetInfo_componentName_no_source_info() { + val chooserTarget = createChooserTarget( + "title", 0.3f, ResolverDataProvider.createComponentName(1), "test_shortcut_id") + val shortcutInfo = createShortcutInfo("id", ResolverDataProvider.createComponentName(2), 3) + val appTarget = AppTarget( + AppTargetId("id"), + chooserTarget.componentName.packageName, + chooserTarget.componentName.className, + UserHandle.CURRENT) + val pkgName = "org.package" + val className = "MainActivity" + val backupResolveInfo = ResolveInfo().apply { + activityInfo = ActivityInfo().apply { + packageName = pkgName + name = className + } + } + + val targetInfo = SelectableTargetInfo.newSelectableTargetInfo( + null, + backupResolveInfo, + mock(), + chooserTarget, + 0.1f, + shortcutInfo, + appTarget, + mock(), + ) + assertThat(targetInfo.resolvedComponentName).isEqualTo(ComponentName(pkgName, className)) + } + @Test fun testNewDisplayResolveInfo() { val intent = Intent(Intent.ACTION_SEND) -- cgit v1.2.3-59-g8ed1b