diff options
| author | 2023-05-24 20:57:36 +0000 | |
|---|---|---|
| committer | 2023-05-24 20:57:36 +0000 | |
| commit | b05a3bc27d45dab3a692f74b01f8f581379c49e9 (patch) | |
| tree | 46a9786874f3e4254aa6a407a1f2190bc3c35c81 /java/tests/src | |
| parent | db3f4b457d75a97ce8810578536170813cbc0511 (diff) | |
| parent | 7e8e8d6afbc1d7220614635c69df26f37abcdb76 (diff) | |
Merge "Encapsulate target icon and label loading in an isolated component." into udc-dev am: 426c97295d am: 7e8e8d6afb
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/modules/IntentResolver/+/23372796
Change-Id: I01dda4422aac9ed41c19c19c2c19cc5b4dd079bc
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
Diffstat (limited to 'java/tests/src')
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(); -        } -    } -}  |