1 /* 2 * Copyright (C) 2020 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package android.searchuiservice.cts; 17 18 import static com.google.common.truth.Truth.assertThat; 19 import static androidx.test.InstrumentationRegistry.getContext; 20 21 import android.app.search.SearchAction; 22 import android.app.search.SearchTarget; 23 import android.appwidget.AppWidgetProviderInfo; 24 import android.content.ComponentName; 25 import android.content.Intent; 26 import android.content.pm.ShortcutInfo; 27 import android.net.Uri; 28 import android.os.Bundle; 29 import android.os.Parcel; 30 import android.os.UserHandle; 31 32 import androidx.annotation.NonNull; 33 import androidx.test.ext.junit.runners.AndroidJUnit4; 34 35 import org.junit.Test; 36 import org.junit.runner.RunWith; 37 38 /** 39 * Tests for {@link SearchTarget} 40 * 41 * atest CtsSearchUiServiceTestCases 42 */ 43 @RunWith(AndroidJUnit4.class) 44 public class SearchTargetTest { 45 private static final String ID = "ID"; 46 private static final String ID2 = "ID2"; 47 private static final String PARENTID = "PARENTID"; 48 private static final String TITLE = "TITLE"; 49 private static final String LAYOUT_TYPE = "hero"; 50 private static final int RESULT_CORPUS = 1 << 0; 51 private static final String PACKAGE_NAME = "package name"; 52 private static final Bundle EXTRAS = new Bundle(); 53 private static final float SCORE = 0.5f; 54 private static final boolean SHOULD_HIDE = false; 55 private static final SearchAction SEARCH_ACTION = new SearchAction.Builder(ID2, TITLE) 56 .setIntent(new Intent()) 57 .build(); 58 private static final Uri SLICE_URI = Uri.EMPTY; 59 60 SearchTarget.Builder mBuilderAction = new SearchTarget.Builder(RESULT_CORPUS, LAYOUT_TYPE, ID) 61 .setPackageName(PACKAGE_NAME) 62 .setUserHandle(UserHandle.CURRENT) 63 .setSearchAction(SEARCH_ACTION) 64 .setScore(SCORE) 65 .setHidden(SHOULD_HIDE) 66 .setParentId(PARENTID) 67 .setExtras(EXTRAS); 68 69 SearchTarget.Builder mBuilderSlice = new SearchTarget.Builder(RESULT_CORPUS, LAYOUT_TYPE, ID) 70 .setPackageName(PACKAGE_NAME) 71 .setUserHandle(UserHandle.CURRENT) 72 .setSliceUri(Uri.EMPTY); 73 74 @Test testBuilderSearchAction()75 public void testBuilderSearchAction() { 76 SearchTarget target = mBuilderAction.build(); 77 assertEverythingSearchAction(target); 78 SearchTarget clone = cloneThroughParcel(target); 79 assertEverythingSearchAction(clone); 80 } 81 assertEverythingSearchAction(@onNull SearchTarget target)82 private void assertEverythingSearchAction(@NonNull SearchTarget target) { 83 assertThat(target.getResultType()).isEqualTo(RESULT_CORPUS); 84 assertThat(target.getLayoutType()).isEqualTo(LAYOUT_TYPE); 85 assertThat(target.getId()).isEqualTo(ID); 86 assertThat(target.getUserHandle()).isEqualTo(UserHandle.CURRENT); 87 assertThat(target.getScore()).isEqualTo(SCORE); 88 assertThat(target.getParentId()).isEqualTo(PARENTID); 89 assertThat(target.getSearchAction()).isEqualTo(SEARCH_ACTION); 90 assertThat(target.getPackageName()).isEqualTo(PACKAGE_NAME); 91 assertThat(target.getExtras().size()).isEqualTo(EXTRAS.size()); 92 assertThat(target.isHidden()).isEqualTo(SHOULD_HIDE); 93 } 94 95 @Test testBuilderSliceUri()96 public void testBuilderSliceUri() { 97 SearchTarget target = mBuilderSlice.build(); 98 assertThat(target.getSliceUri()).isEqualTo(Uri.EMPTY); 99 SearchTarget clone = cloneThroughParcel(target); 100 assertThat(clone.getSliceUri()).isEqualTo(Uri.EMPTY); 101 } 102 103 @Test testBuilderShortcutInfo()104 public void testBuilderShortcutInfo() { 105 ShortcutInfo shortcut = new ShortcutInfo.Builder(getContext(), ID2).build(); 106 SearchTarget target = new SearchTarget.Builder(RESULT_CORPUS, LAYOUT_TYPE, ID) 107 .setPackageName(shortcut.getPackage()) 108 .setUserHandle(UserHandle.CURRENT) 109 .setShortcutInfo(shortcut) 110 .build(); 111 assertThat(target.getShortcutInfo()).isEqualTo(shortcut); 112 SearchTarget clone = cloneThroughParcel(target); 113 assertThat(clone.getShortcutInfo().getId()).isEqualTo(shortcut.getId()); 114 } 115 116 @Test testBuilderAppWidget()117 public void testBuilderAppWidget() { 118 AppWidgetProviderInfo info = new AppWidgetProviderInfo(); 119 info.provider = new ComponentName(PACKAGE_NAME, "classname"); 120 SearchTarget target = new SearchTarget.Builder(RESULT_CORPUS, LAYOUT_TYPE, ID) 121 .setPackageName(PACKAGE_NAME) 122 .setUserHandle(UserHandle.CURRENT) 123 .setAppWidgetProviderInfo(info) 124 .build(); 125 assertThat(target.getAppWidgetProviderInfo()).isEqualTo(info); 126 } 127 cloneThroughParcel(@onNull SearchTarget target)128 private SearchTarget cloneThroughParcel(@NonNull SearchTarget target) { 129 final Parcel parcel = Parcel.obtain(); 130 131 try { 132 // Write to parcel 133 parcel.setDataPosition(0); 134 target.writeToParcel(parcel, 0); 135 136 // Read from parcel 137 parcel.setDataPosition(0); 138 final SearchTarget clone = SearchTarget.CREATOR 139 .createFromParcel(parcel); 140 assertThat(clone).isNotNull(); 141 return clone; 142 } finally { 143 parcel.recycle(); 144 } 145 } 146 } 147