diff options
Diffstat (limited to 'java/tests')
5 files changed, 135 insertions, 139 deletions
diff --git a/java/tests/src/com/android/intentresolver/ChooserListAdapterTest.kt b/java/tests/src/com/android/intentresolver/ChooserListAdapterTest.kt index 9504f377..4612b430 100644 --- a/java/tests/src/com/android/intentresolver/ChooserListAdapterTest.kt +++ b/java/tests/src/com/android/intentresolver/ChooserListAdapterTest.kt @@ -27,10 +27,10 @@ import android.widget.ImageView import android.widget.TextView import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry -import com.android.intentresolver.ChooserListAdapter.LoadDirectShareIconTask import com.android.intentresolver.chooser.DisplayResolveInfo import com.android.intentresolver.chooser.SelectableTargetInfo import com.android.intentresolver.chooser.TargetInfo +import com.android.intentresolver.icons.TargetDataLoader import com.android.internal.R import org.junit.Before import org.junit.Test @@ -40,47 +40,43 @@ import org.mockito.Mockito.verify @RunWith(AndroidJUnit4::class) class ChooserListAdapterTest { - private val PERSONAL_USER_HANDLE: UserHandle = InstrumentationRegistry - .getInstrumentation().getTargetContext().getUser() + private val userHandle: UserHandle = + InstrumentationRegistry.getInstrumentation().targetContext.user - private val packageManager = mock<PackageManager> { - whenever( - resolveActivity(any(), any<ResolveInfoFlags>()) - ).thenReturn(mock()) - } - private val context = InstrumentationRegistry.getInstrumentation().getContext() + private val packageManager = + mock<PackageManager> { + whenever(resolveActivity(any(), any<ResolveInfoFlags>())).thenReturn(mock()) + } + private val context = InstrumentationRegistry.getInstrumentation().context private val resolverListController = mock<ResolverListController>() private val chooserActivityLogger = mock<ChooserActivityLogger>() + private val mTargetDataLoader = mock<TargetDataLoader>() - private fun createChooserListAdapter( - taskProvider: (TargetInfo?) -> LoadDirectShareIconTask - ) = object : ChooserListAdapter( + private val testSubject by lazy { + ChooserListAdapter( context, emptyList(), emptyArray(), emptyList(), false, resolverListController, - null, + userHandle, Intent(), mock(), packageManager, chooserActivityLogger, mock(), 0, - null - ) { - override fun createLoadDirectShareIconTask( - info: SelectableTargetInfo - ): LoadDirectShareIconTask = taskProvider(info) - } + null, + mTargetDataLoader + ) + } @Before fun setup() { // ChooserListAdapter reads DeviceConfig and needs a permission for that. - InstrumentationRegistry - .getInstrumentation() - .getUiAutomation() + InstrumentationRegistry.getInstrumentation() + .uiAutomation .adoptShellPermissionIdentity("android.permission.READ_DEVICE_CONFIG") } @@ -90,41 +86,56 @@ class ChooserListAdapterTest { val viewHolder = ResolverListAdapter.ViewHolder(view) view.tag = viewHolder val targetInfo = createSelectableTargetInfo() - val iconTask = mock<LoadDirectShareIconTask>() - val testSubject = createChooserListAdapter { iconTask } testSubject.onBindView(view, targetInfo, 0) - verify(iconTask, times(1)).loadIcon() + verify(mTargetDataLoader, times(1)).loadDirectShareIcon(any(), any(), any()) } @Test - fun testOnlyOneTaskPerTarget() { + fun onBindView_DirectShareTargetIconAndLabelLoadedOnlyOnce() { val view = createView() val viewHolderOne = ResolverListAdapter.ViewHolder(view) view.tag = viewHolderOne val targetInfo = createSelectableTargetInfo() - val iconTaskOne = mock<LoadDirectShareIconTask>() - val testTaskProvider = mock<() -> LoadDirectShareIconTask> { - whenever(invoke()).thenReturn(iconTaskOne) - } - val testSubject = createChooserListAdapter { testTaskProvider.invoke() } testSubject.onBindView(view, targetInfo, 0) val viewHolderTwo = ResolverListAdapter.ViewHolder(view) view.tag = viewHolderTwo - whenever(testTaskProvider()).thenReturn(mock()) testSubject.onBindView(view, targetInfo, 0) - verify(iconTaskOne, times(1)).loadIcon() - verify(testTaskProvider, times(1)).invoke() + verify(mTargetDataLoader, times(1)).loadDirectShareIcon(any(), any(), any()) + } + + @Test + fun onBindView_AppTargetIconAndLabelLoadedOnlyOnce() { + val view = createView() + val viewHolderOne = ResolverListAdapter.ViewHolder(view) + view.tag = viewHolderOne + val targetInfo = + DisplayResolveInfo.newDisplayResolveInfo( + Intent(), + ResolverDataProvider.createResolveInfo(2, 0, userHandle), + null, + "extended info", + Intent(), + /* resolveInfoPresentationGetter= */ null + ) + testSubject.onBindView(view, targetInfo, 0) + + val viewHolderTwo = ResolverListAdapter.ViewHolder(view) + view.tag = viewHolderTwo + + testSubject.onBindView(view, targetInfo, 0) + + verify(mTargetDataLoader, times(1)).loadAppTargetIcon(any(), any(), any()) } private fun createSelectableTargetInfo(): TargetInfo = SelectableTargetInfo.newSelectableTargetInfo( /* sourceInfo = */ DisplayResolveInfo.newDisplayResolveInfo( Intent(), - ResolverDataProvider.createResolveInfo(2, 0, PERSONAL_USER_HANDLE), + ResolverDataProvider.createResolveInfo(2, 0, userHandle), "label", "extended info", Intent(), @@ -133,7 +144,10 @@ class ChooserListAdapterTest { /* backupResolveInfo = */ mock(), /* resolvedIntent = */ Intent(), /* chooserTarget = */ createChooserTarget( - "Target", 0.5f, ComponentName("pkg", "Class"), "id-1" + "Target", + 0.5f, + ComponentName("pkg", "Class"), + "id-1" ), /* modifiedScore = */ 1f, /* shortcutInfo = */ createShortcutInfo("id-1", ComponentName("pkg", "Class"), 1), diff --git a/java/tests/src/com/android/intentresolver/ChooserWrapperActivity.java b/java/tests/src/com/android/intentresolver/ChooserWrapperActivity.java index fa934f87..6ac6b6d3 100644 --- a/java/tests/src/com/android/intentresolver/ChooserWrapperActivity.java +++ b/java/tests/src/com/android/intentresolver/ChooserWrapperActivity.java @@ -39,6 +39,7 @@ import com.android.intentresolver.chooser.DisplayResolveInfo; import com.android.intentresolver.chooser.TargetInfo; import com.android.intentresolver.flags.FeatureFlagRepository; import com.android.intentresolver.grid.ChooserGridAdapter; +import com.android.intentresolver.icons.TargetDataLoader; import com.android.intentresolver.shortcuts.ShortcutLoader; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; @@ -72,7 +73,8 @@ public class ChooserWrapperActivity UserHandle userHandle, Intent targetIntent, ChooserRequestParameters chooserRequest, - int maxTargetsPerRow) { + int maxTargetsPerRow, + TargetDataLoader targetDataLoader) { PackageManager packageManager = sOverrides.packageManager == null ? context.getPackageManager() : sOverrides.packageManager; @@ -90,7 +92,8 @@ public class ChooserWrapperActivity getChooserActivityLogger(), chooserRequest, maxTargetsPerRow, - userHandle); + userHandle, + targetDataLoader); } @Override diff --git a/java/tests/src/com/android/intentresolver/ResolverActivityTest.java b/java/tests/src/com/android/intentresolver/ResolverActivityTest.java index 31c0a498..7233fd3d 100644 --- a/java/tests/src/com/android/intentresolver/ResolverActivityTest.java +++ b/java/tests/src/com/android/intentresolver/ResolverActivityTest.java @@ -109,7 +109,7 @@ public class ResolverActivityTest { setupResolverControllers(resolvedComponentInfos); final ResolverWrapperActivity activity = mActivityRule.launchActivity(sendIntent); - Espresso.registerIdlingResources(activity.getAdapter().getLabelIdlingResource()); + Espresso.registerIdlingResources(activity.getLabelIdlingResource()); waitForIdle(); assertThat(activity.getAdapter().getCount(), is(2)); @@ -246,7 +246,7 @@ public class ResolverActivityTest { ResolveInfo toChoose = personalResolvedComponentInfos.get(1).getResolveInfoAt(0); Intent sendIntent = createSendImageIntent(); final ResolverWrapperActivity activity = mActivityRule.launchActivity(sendIntent); - Espresso.registerIdlingResources(activity.getAdapter().getLabelIdlingResource()); + Espresso.registerIdlingResources(activity.getLabelIdlingResource()); waitForIdle(); // The other entry is filtered to the last used slot @@ -280,7 +280,7 @@ public class ResolverActivityTest { setupResolverControllers(resolvedComponentInfos); final ResolverWrapperActivity activity = mActivityRule.launchActivity(sendIntent); - Espresso.registerIdlingResources(activity.getAdapter().getLabelIdlingResource()); + Espresso.registerIdlingResources(activity.getLabelIdlingResource()); waitForIdle(); // The other entry is filtered to the other profile slot @@ -321,7 +321,7 @@ public class ResolverActivityTest { .thenReturn(resolvedComponentInfos.get(1).getResolveInfoAt(0)); final ResolverWrapperActivity activity = mActivityRule.launchActivity(sendIntent); - Espresso.registerIdlingResources(activity.getAdapter().getLabelIdlingResource()); + Espresso.registerIdlingResources(activity.getLabelIdlingResource()); waitForIdle(); // The other entry is filtered to the other profile slot @@ -782,7 +782,7 @@ public class ResolverActivityTest { .thenReturn(resolvedComponentInfos.get(1).getResolveInfoAt(0)); final ResolverWrapperActivity activity = mActivityRule.launchActivity(sendIntent); - Espresso.registerIdlingResources(activity.getAdapter().getLabelIdlingResource()); + Espresso.registerIdlingResources(activity.getLabelIdlingResource()); waitForIdle(); // The other entry is filtered to the last used slot @@ -848,7 +848,7 @@ public class ResolverActivityTest { .thenReturn(resolvedComponentInfos.get(0).getResolveInfoAt(0)); final ResolverWrapperActivity activity = mActivityRule.launchActivity(sendIntent); - Espresso.registerIdlingResources(activity.getAdapter().getLabelIdlingResource()); + Espresso.registerIdlingResources(activity.getLabelIdlingResource()); waitForIdle(); assertThat(activity.getAdapter().hasFilteredItem(), is(false)); diff --git a/java/tests/src/com/android/intentresolver/ResolverWrapperActivity.java b/java/tests/src/com/android/intentresolver/ResolverWrapperActivity.java index 645e8c72..401ede26 100644 --- a/java/tests/src/com/android/intentresolver/ResolverWrapperActivity.java +++ b/java/tests/src/com/android/intentresolver/ResolverWrapperActivity.java @@ -22,19 +22,26 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import android.annotation.Nullable; -import android.app.usage.UsageStatsManager; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.UserHandle; import android.util.Pair; +import androidx.annotation.NonNull; +import androidx.test.espresso.idling.CountingIdlingResource; + import com.android.intentresolver.AbstractMultiProfilePagerAdapter.CrossProfileIntentsChecker; +import com.android.intentresolver.chooser.DisplayResolveInfo; +import com.android.intentresolver.chooser.SelectableTargetInfo; import com.android.intentresolver.chooser.TargetInfo; +import com.android.intentresolver.icons.TargetDataLoader; import java.util.List; +import java.util.function.Consumer; import java.util.function.Function; /* @@ -42,7 +49,9 @@ import java.util.function.Function; */ public class ResolverWrapperActivity extends ResolverActivity { static final OverrideData sOverrides = new OverrideData(); - private UsageStatsManager mUsm; + + private final CountingIdlingResource mLabelIdlingResource = + new CountingIdlingResource("LoadLabelTask"); public ResolverWrapperActivity() { super(/* isIntentPicker= */ true); @@ -55,11 +64,20 @@ public class ResolverWrapperActivity extends ResolverActivity { return 1234; } + public CountingIdlingResource getLabelIdlingResource() { + return mLabelIdlingResource; + } + @Override - public ResolverListAdapter createResolverListAdapter(Context context, - List<Intent> payloadIntents, Intent[] initialIntents, List<ResolveInfo> rList, - boolean filterLastUsed, UserHandle userHandle) { - return new ResolverWrapperAdapter( + public ResolverListAdapter createResolverListAdapter( + Context context, + List<Intent> payloadIntents, + Intent[] initialIntents, + List<ResolveInfo> rList, + boolean filterLastUsed, + UserHandle userHandle, + TargetDataLoader targetDataLoader) { + return new ResolverListAdapter( context, payloadIntents, initialIntents, @@ -69,7 +87,8 @@ public class ResolverWrapperActivity extends ResolverActivity { userHandle, payloadIntents.get(0), // TODO: extract upstream this, - userHandle); + userHandle, + new TargetDataLoaderWrapper(targetDataLoader, mLabelIdlingResource)); } @Override @@ -88,8 +107,8 @@ public class ResolverWrapperActivity extends ResolverActivity { return super.createWorkProfileAvailabilityManager(); } - ResolverWrapperAdapter getAdapter() { - return (ResolverWrapperAdapter) mMultiProfilePagerAdapter.getActiveListAdapter(); + ResolverListAdapter getAdapter() { + return mMultiProfilePagerAdapter.getActiveListAdapter(); } ResolverListAdapter getPersonalListAdapter() { @@ -226,4 +245,50 @@ public class ResolverWrapperActivity extends ResolverActivity { .thenAnswer(invocation -> hasCrossProfileIntents); } } + + private static class TargetDataLoaderWrapper extends TargetDataLoader { + private final TargetDataLoader mTargetDataLoader; + private final CountingIdlingResource mLabelIdlingResource; + + private TargetDataLoaderWrapper( + TargetDataLoader targetDataLoader, CountingIdlingResource labelIdlingResource) { + mTargetDataLoader = targetDataLoader; + mLabelIdlingResource = labelIdlingResource; + } + + @Override + public void loadAppTargetIcon( + @NonNull DisplayResolveInfo info, + @NonNull UserHandle userHandle, + @NonNull Consumer<Drawable> callback) { + mTargetDataLoader.loadAppTargetIcon(info, userHandle, callback); + } + + @Override + public void loadDirectShareIcon( + @NonNull SelectableTargetInfo info, + @NonNull UserHandle userHandle, + @NonNull Consumer<Drawable> callback) { + mTargetDataLoader.loadDirectShareIcon(info, userHandle, callback); + } + + @Override + public void loadLabel( + @NonNull DisplayResolveInfo info, + @NonNull Consumer<CharSequence[]> callback) { + mLabelIdlingResource.increment(); + mTargetDataLoader.loadLabel( + info, + (result) -> { + mLabelIdlingResource.decrement(); + callback.accept(result); + }); + } + + @NonNull + @Override + public TargetPresentationGetter createPresentationGetter(@NonNull ResolveInfo info) { + return mTargetDataLoader.createPresentationGetter(info); + } + } } diff --git a/java/tests/src/com/android/intentresolver/ResolverWrapperAdapter.java b/java/tests/src/com/android/intentresolver/ResolverWrapperAdapter.java deleted file mode 100644 index fd310fd8..00000000 --- a/java/tests/src/com/android/intentresolver/ResolverWrapperAdapter.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (C) 2019 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.pm.ResolveInfo; -import android.os.UserHandle; - -import androidx.test.espresso.idling.CountingIdlingResource; - -import com.android.intentresolver.chooser.DisplayResolveInfo; - -import java.util.List; - -public class ResolverWrapperAdapter extends ResolverListAdapter { - - private CountingIdlingResource mLabelIdlingResource = - new CountingIdlingResource("LoadLabelTask"); - - public ResolverWrapperAdapter( - Context context, - List<Intent> payloadIntents, - Intent[] initialIntents, - List<ResolveInfo> rList, - boolean filterLastUsed, - ResolverListController resolverListController, - UserHandle userHandle, - Intent targetIntent, - ResolverListCommunicator resolverListCommunicator, - UserHandle initialIntentsUserHandle) { - super( - context, - payloadIntents, - initialIntents, - rList, - filterLastUsed, - resolverListController, - userHandle, - targetIntent, - resolverListCommunicator, - false, - initialIntentsUserHandle); - } - - public CountingIdlingResource getLabelIdlingResource() { - return mLabelIdlingResource; - } - - @Override - protected LoadLabelTask createLoadLabelTask(DisplayResolveInfo info) { - return new LoadLabelWrapperTask(info); - } - - class LoadLabelWrapperTask extends LoadLabelTask { - - protected LoadLabelWrapperTask(DisplayResolveInfo dri) { - super(dri); - } - - @Override - protected void onPreExecute() { - mLabelIdlingResource.increment(); - } - - @Override - protected void onPostExecute(CharSequence[] result) { - super.onPostExecute(result); - mLabelIdlingResource.decrement(); - } - } -} |