Include home app when searching installed apps
Change-Id: I4677307bb23f03ed7fb224c32312be7cb114763d Fix: 62221174 Test: make RunSettingsRoboTests
This commit is contained in:
@@ -37,6 +37,7 @@ import com.android.settings.applications.PackageManagerWrapper;
|
|||||||
import com.android.settings.dashboard.SiteMapManager;
|
import com.android.settings.dashboard.SiteMapManager;
|
||||||
import com.android.settings.utils.AsyncLoader;
|
import com.android.settings.utils.AsyncLoader;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@@ -55,7 +56,7 @@ public class InstalledAppResultLoader extends AsyncLoader<Set<? extends SearchRe
|
|||||||
private final String mQuery;
|
private final String mQuery;
|
||||||
private final UserManager mUserManager;
|
private final UserManager mUserManager;
|
||||||
private final PackageManagerWrapper mPackageManager;
|
private final PackageManagerWrapper mPackageManager;
|
||||||
|
private final List<ResolveInfo> mHomeActivities = new ArrayList<>();
|
||||||
|
|
||||||
public InstalledAppResultLoader(Context context, PackageManagerWrapper pmWrapper,
|
public InstalledAppResultLoader(Context context, PackageManagerWrapper pmWrapper,
|
||||||
String query, SiteMapManager mapManager) {
|
String query, SiteMapManager mapManager) {
|
||||||
@@ -71,6 +72,9 @@ public class InstalledAppResultLoader extends AsyncLoader<Set<? extends SearchRe
|
|||||||
final Set<AppSearchResult> results = new HashSet<>();
|
final Set<AppSearchResult> results = new HashSet<>();
|
||||||
final PackageManager pm = mPackageManager.getPackageManager();
|
final PackageManager pm = mPackageManager.getPackageManager();
|
||||||
|
|
||||||
|
mHomeActivities.clear();
|
||||||
|
mPackageManager.getHomeActivities(mHomeActivities);
|
||||||
|
|
||||||
for (UserInfo user : getUsersToCount()) {
|
for (UserInfo user : getUsersToCount()) {
|
||||||
final List<ApplicationInfo> apps =
|
final List<ApplicationInfo> apps =
|
||||||
mPackageManager.getInstalledApplicationsAsUser(
|
mPackageManager.getInstalledApplicationsAsUser(
|
||||||
@@ -106,11 +110,18 @@ public class InstalledAppResultLoader extends AsyncLoader<Set<? extends SearchRe
|
|||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the candidate should be included in candidate list
|
||||||
|
* <p/>
|
||||||
|
* This method matches logic in {@code ApplicationState#FILTER_DOWNLOADED_AND_LAUNCHER}.
|
||||||
|
*/
|
||||||
private boolean shouldIncludeAsCandidate(ApplicationInfo info, UserInfo user) {
|
private boolean shouldIncludeAsCandidate(ApplicationInfo info, UserInfo user) {
|
||||||
|
// Not system app
|
||||||
if ((info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0
|
if ((info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0
|
||||||
|| (info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
|
|| (info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
// Shows up in launcher
|
||||||
final Intent launchIntent = new Intent(LAUNCHER_PROBE)
|
final Intent launchIntent = new Intent(LAUNCHER_PROBE)
|
||||||
.setPackage(info.packageName);
|
.setPackage(info.packageName);
|
||||||
final List<ResolveInfo> intents = mPackageManager.queryIntentActivitiesAsUser(
|
final List<ResolveInfo> intents = mPackageManager.queryIntentActivitiesAsUser(
|
||||||
@@ -119,7 +130,11 @@ public class InstalledAppResultLoader extends AsyncLoader<Set<? extends SearchRe
|
|||||||
| PackageManager.MATCH_DIRECT_BOOT_AWARE
|
| PackageManager.MATCH_DIRECT_BOOT_AWARE
|
||||||
| PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
|
| PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
|
||||||
user.id);
|
user.id);
|
||||||
return intents != null && intents.size() != 0;
|
if (intents != null && intents.size() != 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// Is launcher app itself
|
||||||
|
return isPackageInList(mHomeActivities, info.packageName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -194,6 +209,15 @@ public class InstalledAppResultLoader extends AsyncLoader<Set<? extends SearchRe
|
|||||||
return NAME_NO_MATCH;
|
return NAME_NO_MATCH;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isPackageInList(List<ResolveInfo> resolveInfos, String pkg) {
|
||||||
|
for (ResolveInfo info : resolveInfos) {
|
||||||
|
if (TextUtils.equals(info.activityInfo.packageName, pkg)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
private List<String> getBreadCrumb() {
|
private List<String> getBreadCrumb() {
|
||||||
if (mBreadcrumb == null || mBreadcrumb.isEmpty()) {
|
if (mBreadcrumb == null || mBreadcrumb.isEmpty()) {
|
||||||
final Context context = getContext();
|
final Context context = getContext();
|
||||||
@@ -206,6 +230,7 @@ public class InstalledAppResultLoader extends AsyncLoader<Set<? extends SearchRe
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* A temporary ranking scheme for installed apps.
|
* A temporary ranking scheme for installed apps.
|
||||||
|
*
|
||||||
* @param wordDiff difference between query length and app name length.
|
* @param wordDiff difference between query length and app name length.
|
||||||
* @return the ranking.
|
* @return the ranking.
|
||||||
*/
|
*/
|
||||||
|
@@ -19,6 +19,7 @@ package com.android.settings.search;
|
|||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.content.pm.ActivityInfo;
|
||||||
import android.content.pm.ResolveInfo;
|
import android.content.pm.ResolveInfo;
|
||||||
import android.content.pm.UserInfo;
|
import android.content.pm.UserInfo;
|
||||||
import android.os.UserManager;
|
import android.os.UserManager;
|
||||||
@@ -28,8 +29,6 @@ import com.android.settings.SettingsRobolectricTestRunner;
|
|||||||
import com.android.settings.TestConfig;
|
import com.android.settings.TestConfig;
|
||||||
import com.android.settings.applications.PackageManagerWrapper;
|
import com.android.settings.applications.PackageManagerWrapper;
|
||||||
import com.android.settings.dashboard.SiteMapManager;
|
import com.android.settings.dashboard.SiteMapManager;
|
||||||
import com.android.settings.search.InstalledAppResultLoader;
|
|
||||||
import com.android.settings.search.SearchResult;
|
|
||||||
import com.android.settings.testutils.ApplicationTestUtils;
|
import com.android.settings.testutils.ApplicationTestUtils;
|
||||||
import com.android.settings.testutils.FakeFeatureFactory;
|
import com.android.settings.testutils.FakeFeatureFactory;
|
||||||
|
|
||||||
@@ -39,6 +38,8 @@ import org.junit.runner.RunWith;
|
|||||||
import org.mockito.Answers;
|
import org.mockito.Answers;
|
||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
import org.mockito.MockitoAnnotations;
|
import org.mockito.MockitoAnnotations;
|
||||||
|
import org.mockito.invocation.InvocationOnMock;
|
||||||
|
import org.mockito.stubbing.Answer;
|
||||||
import org.robolectric.annotation.Config;
|
import org.robolectric.annotation.Config;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -52,6 +53,7 @@ import static android.content.pm.ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
|
|||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
import static org.mockito.Matchers.any;
|
import static org.mockito.Matchers.any;
|
||||||
import static org.mockito.Matchers.anyInt;
|
import static org.mockito.Matchers.anyInt;
|
||||||
|
import static org.mockito.Matchers.anyList;
|
||||||
import static org.mockito.Matchers.anyString;
|
import static org.mockito.Matchers.anyString;
|
||||||
import static org.mockito.Matchers.eq;
|
import static org.mockito.Matchers.eq;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
@@ -166,6 +168,36 @@ public class InstalledAppResultLoaderTest {
|
|||||||
assertThat(mLoader.loadInBackground().size()).isEqualTo(1);
|
assertThat(mLoader.loadInBackground().size()).isEqualTo(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void query_matchingQuery_shouldReturnSystemAppIfHomeApp() {
|
||||||
|
when(mPackageManagerWrapper.getInstalledApplicationsAsUser(anyInt(), anyInt()))
|
||||||
|
.thenReturn(Arrays.asList(
|
||||||
|
ApplicationTestUtils.buildInfo(0 /* uid */, "app1", FLAG_SYSTEM,
|
||||||
|
0 /* targetSdkVersion */)));
|
||||||
|
when(mPackageManagerWrapper.queryIntentActivitiesAsUser(
|
||||||
|
any(Intent.class), anyInt(), anyInt()))
|
||||||
|
.thenReturn(null);
|
||||||
|
|
||||||
|
when(mPackageManagerWrapper.getHomeActivities(anyList())).thenAnswer(new Answer<Object>() {
|
||||||
|
@Override
|
||||||
|
public Object answer(InvocationOnMock invocation) throws Throwable {
|
||||||
|
final List<ResolveInfo> list = (List<ResolveInfo>) invocation.getArguments()[0];
|
||||||
|
final ResolveInfo info = new ResolveInfo();
|
||||||
|
info.activityInfo = new ActivityInfo();
|
||||||
|
info.activityInfo.packageName = "app1";
|
||||||
|
list.add(info);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
final String query = "app";
|
||||||
|
|
||||||
|
mLoader = new InstalledAppResultLoader(mContext, mPackageManagerWrapper, query,
|
||||||
|
mSiteMapManager);
|
||||||
|
|
||||||
|
assertThat(mLoader.loadInBackground().size()).isEqualTo(1);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void query_matchingQuery_shouldNotReturnSystemAppIfNotLaunchable() {
|
public void query_matchingQuery_shouldNotReturnSystemAppIfNotLaunchable() {
|
||||||
when(mPackageManagerWrapper.getInstalledApplicationsAsUser(anyInt(), anyInt()))
|
when(mPackageManagerWrapper.getInstalledApplicationsAsUser(anyInt(), anyInt()))
|
||||||
|
Reference in New Issue
Block a user