blob: 6ba5b6bc7d18ca7479c84fd777015221fc4b8adc [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.share.share_sheet;
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.when;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import androidx.test.filters.MediumTest;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestRule;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.chromium.base.test.BaseActivityTestRule;
import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.share.ChromeShareExtras;
import org.chromium.chrome.browser.share.link_to_text.LinkToTextCoordinator.LinkGeneration;
import org.chromium.chrome.browser.share.share_sheet.ShareSheetPropertyModelBuilder.ContentType;
import org.chromium.chrome.test.ChromeBrowserTestRule;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.chrome.test.util.browser.Features;
import org.chromium.components.browser_ui.share.ShareParams;
import org.chromium.ui.modelutil.PropertyModel;
import org.chromium.ui.test.util.DummyUiActivity;
import java.util.ArrayList;
import java.util.List;
/**
* Tests {@link ShareSheetPropertyModelBuilder}.
*/
@RunWith(ChromeJUnit4ClassRunner.class)
@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
public final class ShareSheetPropertyModelBuilderTest {
@Rule
public final ChromeBrowserTestRule mBrowserTestRule = new ChromeBrowserTestRule();
@Rule
public BaseActivityTestRule<DummyUiActivity> mActivityTestRule =
new BaseActivityTestRule<>(DummyUiActivity.class);
@Rule
public TestRule mFeatureProcessor = new Features.JUnitProcessor();
@Mock
private PackageManager mPackageManager;
@Mock
private Profile mProfile;
@Mock
private ShareParams mParams;
@Mock
private ResolveInfo mTextResolveInfo1;
@Mock
private ResolveInfo mTextResolveInfo2;
@Mock
private ResolveInfo mTextResolveInfo3;
@Mock
private ResolveInfo mImageResolveInfo1;
@Mock
private ResolveInfo mImageResolveInfo2;
private static final String sTextModelLabel1 = "textModelLabel1";
private static final String sTextModelLabel2 = "textModelLabel2";
private static final String sImageModelLabel1 = "imageModelLabel1";
private static final String sImageModelLabel2 = "imageModelLabel2";
private static final String IMAGE_TYPE = "image/jpeg";
private static final String URL = "http://www.google.com/";
private Activity mActivity;
private ShareSheetPropertyModelBuilder mPropertyModelBuilder;
@Before
public void setUp() throws PackageManager.NameNotFoundException {
MockitoAnnotations.initMocks(this);
mActivityTestRule.launchActivity(null);
mActivity = mActivityTestRule.getActivity();
mPropertyModelBuilder = new ShareSheetPropertyModelBuilder(null, mPackageManager, mProfile);
setUpResolveInfo(mTextResolveInfo1, "textPackage1", sTextModelLabel1);
setUpResolveInfo(mTextResolveInfo2, "textPackage2", sTextModelLabel2);
setUpResolveInfo(mImageResolveInfo1, "imagePackage1", sImageModelLabel1);
setUpResolveInfo(mImageResolveInfo2, "imagePackage1", sImageModelLabel2);
mImageResolveInfo2.activityInfo.name = "com.google.android.gm.ComposeActivityGmailExternal";
doReturn(ImmutableList.of(mTextResolveInfo1, mTextResolveInfo2))
.when(mPackageManager)
.queryIntentActivities(
argThat(intent -> intent.getType().equals("text/plain")), anyInt());
doReturn(ImmutableList.of(mImageResolveInfo1, mImageResolveInfo2))
.when(mPackageManager)
.queryIntentActivities(
argThat(intent -> intent.getType().equals("image/jpeg")), anyInt());
when(mPackageManager.getResourcesForApplication(anyString()))
.thenReturn(mActivity.getResources());
}
@Test
@MediumTest
public void getContentTypes_hasCorrectLinkContentType() {
ShareParams shareParams = new ShareParams.Builder(null, "", URL).build();
ChromeShareExtras shareExtras = new ChromeShareExtras.Builder().build();
assertEquals("Should contain LINK_PAGE_NOT_VISIBLE.",
ImmutableSet.of(ContentType.LINK_PAGE_NOT_VISIBLE),
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, shareExtras));
shareExtras = new ChromeShareExtras.Builder().setIsUrlOfVisiblePage(true).build();
assertEquals("Should contain LINK_PAGE_VISIBLE.",
ImmutableSet.of(ContentType.LINK_PAGE_VISIBLE),
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, shareExtras));
}
@Test
@MediumTest
public void getContentTypes_NoUrl_hasNoLinkContentType() {
ShareParams shareParams = new ShareParams.Builder(null, "", "").build();
ChromeShareExtras shareExtras = new ChromeShareExtras.Builder().build();
assertEquals("Should not contain LINK_PAGE_NOT_VISIBLE", ImmutableSet.of(),
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, shareExtras));
shareExtras = new ChromeShareExtras.Builder().setIsUrlOfVisiblePage(true).build();
assertEquals("Should not contain LINK_PAGE_VISIBLE.", ImmutableSet.of(),
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, shareExtras));
}
@Test
@MediumTest
public void getContentTypes_UrlDifferentFromText_hasTextContentType() {
ShareParams shareParams = new ShareParams.Builder(null, "", "").setText("testText").build();
ChromeShareExtras shareExtras = new ChromeShareExtras.Builder().build();
assertEquals("Should contain TEXT.", ImmutableSet.of(ContentType.TEXT),
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, shareExtras));
}
@Test
@MediumTest
public void getContentTypes_TextIsNull_hasNoTextContentType() {
ShareParams shareParams = new ShareParams.Builder(null, "", "").build();
ChromeShareExtras shareExtras = new ChromeShareExtras.Builder().build();
assertEquals("Should not contain TEXT.", ImmutableSet.of(),
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, shareExtras));
}
@Test
@MediumTest
public void getContentTypes_UrlDifferentFromText_hasHighlightedTextContentType() {
ShareParams shareParams = new ShareParams.Builder(null, "", "").setText("testText").build();
ChromeShareExtras shareExtras =
new ChromeShareExtras.Builder().setIsUserHighlightedText(true).build();
assertEquals("Should contain HIGHLIGHTED_TEXT.",
ImmutableSet.of(ContentType.HIGHLIGHTED_TEXT),
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, shareExtras));
}
@Test
@MediumTest
public void getContentTypes_hasImageContentType() {
ShareParams shareParams = new ShareParams.Builder(null, "", "")
.setFileUris(new ArrayList<>(ImmutableSet.of(Uri.EMPTY)))
.setFileContentType(IMAGE_TYPE)
.build();
ChromeShareExtras shareExtras = new ChromeShareExtras.Builder().build();
assertEquals("Should contain IMAGE.", ImmutableSet.of(ContentType.IMAGE),
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, shareExtras));
}
@Test
@MediumTest
public void getContentTypes_NoFiles_hasNoImageContentType() {
ShareParams shareParams =
new ShareParams.Builder(null, "", "").setFileContentType(IMAGE_TYPE).build();
ChromeShareExtras shareExtras = new ChromeShareExtras.Builder().build();
assertEquals("Should not contain IMAGE.", ImmutableSet.of(),
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, shareExtras));
}
@Test
@MediumTest
public void getContentTypes_hasOtherFileContentType() {
ShareParams shareParams =
new ShareParams.Builder(null, "", "")
.setFileUris(new ArrayList<>(ImmutableList.of(Uri.EMPTY, Uri.EMPTY)))
.setFileContentType("*/*")
.build();
ChromeShareExtras shareExtras = new ChromeShareExtras.Builder().build();
assertEquals("Should contain OTHER_FILE_TYPE.",
ImmutableSet.of(ContentType.OTHER_FILE_TYPE),
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, shareExtras));
}
@Test
@MediumTest
public void getContentTypes_hasImageAndLink_AndPage() {
ShareParams shareParams =
new ShareParams.Builder(null, "", URL)
.setFileUris(new ArrayList<>(ImmutableList.of(Uri.EMPTY, Uri.EMPTY)))
.setFileContentType("image/png")
.build();
ChromeShareExtras shareExtras = new ChromeShareExtras.Builder().build();
assertEquals("Should contain IMAGE_AND_LINK and LINK_PAGE_NOT_VISIBLE.",
ImmutableSet.of(ContentType.IMAGE_AND_LINK, ContentType.LINK_PAGE_NOT_VISIBLE),
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, shareExtras));
}
@Test
@MediumTest
public void getContentTypes_hasImageAndLink_NoPage() {
ShareParams shareParams =
new ShareParams.Builder(null, "", URL)
.setFileUris(new ArrayList<>(ImmutableList.of(Uri.EMPTY, Uri.EMPTY)))
.setFileContentType("image/png")
.build();
ChromeShareExtras shareExtras =
new ChromeShareExtras.Builder().setSkipPageSharingActions(true).build();
assertEquals("Should contain IMAGE_AND_LINK.", ImmutableSet.of(ContentType.IMAGE_AND_LINK),
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, shareExtras));
}
@Test
@MediumTest
public void getContentTypes_NoFiles_hasNoFileContentType() {
ShareParams shareParams =
new ShareParams.Builder(null, "", "").setFileContentType("*/*").build();
ChromeShareExtras shareExtras = new ChromeShareExtras.Builder().build();
assertEquals("Should not contain OTHER_FILE_TYPE.", ImmutableSet.of(),
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, shareExtras));
}
@Test
@MediumTest
public void getContentTypes_hasMultipleContentTypes() {
ShareParams shareParams =
new ShareParams.Builder(null, "", URL)
.setText("testText")
.setFileUris(new ArrayList<>(ImmutableList.of(Uri.EMPTY, Uri.EMPTY)))
.setFileContentType("*/*")
.build();
ChromeShareExtras shareExtras = new ChromeShareExtras.Builder().build();
assertEquals("Should contain correct content types.",
ImmutableSet.of(ContentType.LINK_PAGE_NOT_VISIBLE, ContentType.OTHER_FILE_TYPE,
ContentType.TEXT, ContentType.LINK_AND_TEXT),
ShareSheetPropertyModelBuilder.getContentTypes(shareParams, shareExtras));
}
@Test
@MediumTest
public void selectThirdPartyApps_LinkShare_returnsTextSharingModels() {
ShareParams shareParams = new ShareParams.Builder(null, "", URL).build();
List<PropertyModel> propertyModels = mPropertyModelBuilder.selectThirdPartyApps(null,
ImmutableSet.of(ContentType.LINK_PAGE_VISIBLE), shareParams, /*saveLastUsed=*/false,
/*shareStartTime=*/0, /*linkGenerationStatusForMetrics=*/LinkGeneration.MAX);
assertEquals("Incorrect number of property models.", 2, propertyModels.size());
assertModelsAreInTheRightOrder(
propertyModels, ImmutableList.of(sTextModelLabel1, sTextModelLabel2));
}
@Test
@MediumTest
public void selectThirdPartyApps_ImageShare_returnsImageSharingModels() {
ShareParams shareParams =
new ShareParams.Builder(null, "", "").setFileContentType("image/jpeg").build();
List<PropertyModel> propertyModels = mPropertyModelBuilder.selectThirdPartyApps(null,
ImmutableSet.of(ContentType.IMAGE), shareParams, /*saveLastUsed=*/false,
/*shareStartTime=*/0, /*linkGenerationStatusForMetrics=*/LinkGeneration.MAX);
assertEquals("Incorrect number of property models.", 2, propertyModels.size());
assertModelsAreInTheRightOrder(
propertyModels, ImmutableList.of(sImageModelLabel2, sImageModelLabel1));
}
@Test
@MediumTest
public void selectThirdPartyApps_LinkImageShare_returnsTextAndImageSharingModels() {
ShareParams shareParams =
new ShareParams.Builder(null, "", URL).setFileContentType("image/jpeg").build();
List<PropertyModel> propertyModels = mPropertyModelBuilder.selectThirdPartyApps(null,
ImmutableSet.of(ContentType.LINK_PAGE_VISIBLE, ContentType.IMAGE), shareParams,
/*saveLastUsed=*/false, /*shareStartTime=*/0,
/*linkGenerationStatusForMetrics=*/LinkGeneration.MAX);
assertEquals("Incorrect number of property models.", 4, propertyModels.size());
assertModelsAreInTheRightOrder(propertyModels,
ImmutableList.of(
sImageModelLabel2, sTextModelLabel1, sTextModelLabel2, sImageModelLabel1));
}
private void setUpResolveInfo(ResolveInfo resolveInfo, String packageName, String label)
throws PackageManager.NameNotFoundException {
resolveInfo.activityInfo =
mActivity.getPackageManager().getActivityInfo(mActivity.getComponentName(), 0);
resolveInfo.activityInfo.packageName = packageName;
when(resolveInfo.loadLabel(any())).thenReturn(label);
when(resolveInfo.loadIcon(any())).thenReturn(null);
resolveInfo.icon = 0;
}
private void assertModelsAreInTheRightOrder(
List<PropertyModel> propertyModels, List<String> expectedOrder) {
ImmutableList.Builder<String> actualLabelOrder = ImmutableList.builder();
for (PropertyModel propertyModel : propertyModels) {
actualLabelOrder.add(propertyModel.get(ShareSheetItemViewProperties.LABEL));
}
assertEquals(
"Property models in the wrong order.", expectedOrder, actualLabelOrder.build());
}
}