Loading src/com/android/settings/search/AppSearchResult.java +5 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.settings.search; import android.content.pm.ApplicationInfo; import android.os.UserHandle; public class AppSearchResult extends SearchResult { /** Loading @@ -30,6 +31,10 @@ public class AppSearchResult extends SearchResult { info = builder.mInfo; } public UserHandle getAppUserHandle() { return new UserHandle(UserHandle.getUserId(info.uid)); } public static class Builder extends SearchResult.Builder { protected ApplicationInfo mInfo; Loading src/com/android/settings/search/InstalledAppResultLoader.java +2 −1 Original line number Diff line number Diff line Loading @@ -40,6 +40,7 @@ import com.android.settings.utils.AsyncLoader; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.Set; /** Loading Loading @@ -99,7 +100,7 @@ public class InstalledAppResultLoader extends AsyncLoader<Set<? extends SearchRe final AppSearchResult.Builder builder = new AppSearchResult.Builder(); builder.setAppInfo(info) .setStableId(info.packageName.hashCode()) .setStableId(Objects.hash(info.packageName, user.id)) .setTitle(info.loadLabel(pm)) .setRank(getRank(wordDiff)) .addBreadcrumbs(getBreadCrumb()) Loading src/com/android/settings/search/IntentSearchViewHolder.java +13 −3 Original line number Diff line number Diff line Loading @@ -16,9 +16,11 @@ */ package com.android.settings.search; import android.content.Intent; import android.os.UserHandle; import android.view.View; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.logging.nano.MetricsProto; /** * ViewHolder for intent based search results. Loading @@ -32,7 +34,7 @@ public class IntentSearchViewHolder extends SearchViewHolder { @Override public int getClickActionMetricName() { return MetricsEvent.ACTION_CLICK_SETTINGS_SEARCH_RESULT; return MetricsProto.MetricsEvent.ACTION_CLICK_SETTINGS_SEARCH_RESULT; } @Override Loading @@ -41,7 +43,15 @@ public class IntentSearchViewHolder extends SearchViewHolder { itemView.setOnClickListener(v -> { fragment.onSearchResultClicked(this, result); fragment.startActivity(result.payload.getIntent()); final Intent intent = result.payload.getIntent(); // Use app user id to support work profile use case. if (result instanceof AppSearchResult) { AppSearchResult appResult = (AppSearchResult) result; UserHandle userHandle = appResult.getAppUserHandle(); fragment.getActivity().startActivityAsUser(intent, userHandle); } else { fragment.startActivity(intent); } }); } } src/com/android/settings/search/SearchViewHolder.java +11 −1 Original line number Diff line number Diff line Loading @@ -18,8 +18,11 @@ package com.android.settings.search; import android.content.Context; import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; import android.os.UserHandle; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.util.IconDrawableFactory; import android.view.View; import android.widget.ImageView; import android.widget.TextView; Loading @@ -46,6 +49,7 @@ public abstract class SearchViewHolder extends RecyclerView.ViewHolder { protected final MetricsFeatureProvider mMetricsFeatureProvider; protected final SearchFeatureProvider mSearchFeatureProvider; private final IconDrawableFactory mIconDrawableFactory; public SearchViewHolder(View view) { super(view); Loading @@ -59,6 +63,7 @@ public abstract class SearchViewHolder extends RecyclerView.ViewHolder { breadcrumbView = view.findViewById(R.id.breadcrumb); mPlaceholderSummary = view.getContext().getString(R.string.summary_placeholder); mIconDrawableFactory = IconDrawableFactory.newInstance(view.getContext()); } public abstract int getClickActionMetricName(); Loading @@ -78,7 +83,12 @@ public abstract class SearchViewHolder extends RecyclerView.ViewHolder { if (result instanceof AppSearchResult) { AppSearchResult appResult = (AppSearchResult) result; PackageManager pm = fragment.getActivity().getPackageManager(); iconView.setImageDrawable(appResult.info.loadIcon(pm)); UserHandle userHandle = appResult.getAppUserHandle(); Drawable badgedIcon = mIconDrawableFactory.getBadgedIcon(appResult.info, userHandle.getIdentifier()); iconView.setImageDrawable(badgedIcon); titleView.setContentDescription( pm.getUserBadgedLabel(appResult.info.loadLabel(pm), userHandle)); } else { // Valid even when result.icon is null. iconView.setImageDrawable(result.icon); Loading tests/robotests/src/com/android/settings/search/InstalledAppResultLoaderTest.java +39 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.ResolveInfo; import android.content.pm.UserInfo; import android.os.UserHandle; import android.os.UserManager; import com.android.settings.R; Loading @@ -47,6 +48,7 @@ import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import static android.content.pm.ApplicationInfo.FLAG_SYSTEM; import static android.content.pm.ApplicationInfo.FLAG_UPDATED_SYSTEM_APP; Loading Loading @@ -387,4 +389,41 @@ public class InstalledAppResultLoaderTest { assertThat(mLoader.loadInBackground().size()).isEqualTo(0); } @Test public void query_appExistsInBothProfiles() { final String query = "carrot"; final String packageName = "carrot"; final int user1 = 0; final int user2 = 10; final int uid = 67672; List<UserInfo> infos = new ArrayList<>(); infos.add(new UserInfo(user1, "user 1", 0)); infos.add(new UserInfo(user2, "user 2", UserInfo.FLAG_MANAGED_PROFILE)); when(mUserManager.getProfiles(anyInt())).thenReturn(infos); when(mPackageManagerWrapper.getInstalledApplicationsAsUser(anyInt(), eq(user1))) .thenReturn(Arrays.asList( ApplicationTestUtils.buildInfo(UserHandle.getUid(user1, uid) /* uid */, packageName, 0 /* flags */, 0 /* targetSdkVersion */))); when(mPackageManagerWrapper.getInstalledApplicationsAsUser(anyInt(), eq(user2))) .thenReturn(Arrays.asList( ApplicationTestUtils.buildInfo(UserHandle.getUid(user2, uid) /* uid */, packageName, 0 /* flags */, 0 /* targetSdkVersion */))); mLoader = new InstalledAppResultLoader(mContext, mPackageManagerWrapper, query, mSiteMapManager); Set<AppSearchResult> searchResults = (Set<AppSearchResult>) mLoader.loadInBackground(); assertThat(searchResults).hasSize(2); Set<Integer> uidResults = searchResults.stream().map(result -> result.info.uid).collect( Collectors.toSet()); assertThat(uidResults).containsExactly( UserHandle.getUid(user1, uid), UserHandle.getUid(user2, uid)); } } Loading
src/com/android/settings/search/AppSearchResult.java +5 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.settings.search; import android.content.pm.ApplicationInfo; import android.os.UserHandle; public class AppSearchResult extends SearchResult { /** Loading @@ -30,6 +31,10 @@ public class AppSearchResult extends SearchResult { info = builder.mInfo; } public UserHandle getAppUserHandle() { return new UserHandle(UserHandle.getUserId(info.uid)); } public static class Builder extends SearchResult.Builder { protected ApplicationInfo mInfo; Loading
src/com/android/settings/search/InstalledAppResultLoader.java +2 −1 Original line number Diff line number Diff line Loading @@ -40,6 +40,7 @@ import com.android.settings.utils.AsyncLoader; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.Set; /** Loading Loading @@ -99,7 +100,7 @@ public class InstalledAppResultLoader extends AsyncLoader<Set<? extends SearchRe final AppSearchResult.Builder builder = new AppSearchResult.Builder(); builder.setAppInfo(info) .setStableId(info.packageName.hashCode()) .setStableId(Objects.hash(info.packageName, user.id)) .setTitle(info.loadLabel(pm)) .setRank(getRank(wordDiff)) .addBreadcrumbs(getBreadCrumb()) Loading
src/com/android/settings/search/IntentSearchViewHolder.java +13 −3 Original line number Diff line number Diff line Loading @@ -16,9 +16,11 @@ */ package com.android.settings.search; import android.content.Intent; import android.os.UserHandle; import android.view.View; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.logging.nano.MetricsProto; /** * ViewHolder for intent based search results. Loading @@ -32,7 +34,7 @@ public class IntentSearchViewHolder extends SearchViewHolder { @Override public int getClickActionMetricName() { return MetricsEvent.ACTION_CLICK_SETTINGS_SEARCH_RESULT; return MetricsProto.MetricsEvent.ACTION_CLICK_SETTINGS_SEARCH_RESULT; } @Override Loading @@ -41,7 +43,15 @@ public class IntentSearchViewHolder extends SearchViewHolder { itemView.setOnClickListener(v -> { fragment.onSearchResultClicked(this, result); fragment.startActivity(result.payload.getIntent()); final Intent intent = result.payload.getIntent(); // Use app user id to support work profile use case. if (result instanceof AppSearchResult) { AppSearchResult appResult = (AppSearchResult) result; UserHandle userHandle = appResult.getAppUserHandle(); fragment.getActivity().startActivityAsUser(intent, userHandle); } else { fragment.startActivity(intent); } }); } }
src/com/android/settings/search/SearchViewHolder.java +11 −1 Original line number Diff line number Diff line Loading @@ -18,8 +18,11 @@ package com.android.settings.search; import android.content.Context; import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; import android.os.UserHandle; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.util.IconDrawableFactory; import android.view.View; import android.widget.ImageView; import android.widget.TextView; Loading @@ -46,6 +49,7 @@ public abstract class SearchViewHolder extends RecyclerView.ViewHolder { protected final MetricsFeatureProvider mMetricsFeatureProvider; protected final SearchFeatureProvider mSearchFeatureProvider; private final IconDrawableFactory mIconDrawableFactory; public SearchViewHolder(View view) { super(view); Loading @@ -59,6 +63,7 @@ public abstract class SearchViewHolder extends RecyclerView.ViewHolder { breadcrumbView = view.findViewById(R.id.breadcrumb); mPlaceholderSummary = view.getContext().getString(R.string.summary_placeholder); mIconDrawableFactory = IconDrawableFactory.newInstance(view.getContext()); } public abstract int getClickActionMetricName(); Loading @@ -78,7 +83,12 @@ public abstract class SearchViewHolder extends RecyclerView.ViewHolder { if (result instanceof AppSearchResult) { AppSearchResult appResult = (AppSearchResult) result; PackageManager pm = fragment.getActivity().getPackageManager(); iconView.setImageDrawable(appResult.info.loadIcon(pm)); UserHandle userHandle = appResult.getAppUserHandle(); Drawable badgedIcon = mIconDrawableFactory.getBadgedIcon(appResult.info, userHandle.getIdentifier()); iconView.setImageDrawable(badgedIcon); titleView.setContentDescription( pm.getUserBadgedLabel(appResult.info.loadLabel(pm), userHandle)); } else { // Valid even when result.icon is null. iconView.setImageDrawable(result.icon); Loading
tests/robotests/src/com/android/settings/search/InstalledAppResultLoaderTest.java +39 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.ResolveInfo; import android.content.pm.UserInfo; import android.os.UserHandle; import android.os.UserManager; import com.android.settings.R; Loading @@ -47,6 +48,7 @@ import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import static android.content.pm.ApplicationInfo.FLAG_SYSTEM; import static android.content.pm.ApplicationInfo.FLAG_UPDATED_SYSTEM_APP; Loading Loading @@ -387,4 +389,41 @@ public class InstalledAppResultLoaderTest { assertThat(mLoader.loadInBackground().size()).isEqualTo(0); } @Test public void query_appExistsInBothProfiles() { final String query = "carrot"; final String packageName = "carrot"; final int user1 = 0; final int user2 = 10; final int uid = 67672; List<UserInfo> infos = new ArrayList<>(); infos.add(new UserInfo(user1, "user 1", 0)); infos.add(new UserInfo(user2, "user 2", UserInfo.FLAG_MANAGED_PROFILE)); when(mUserManager.getProfiles(anyInt())).thenReturn(infos); when(mPackageManagerWrapper.getInstalledApplicationsAsUser(anyInt(), eq(user1))) .thenReturn(Arrays.asList( ApplicationTestUtils.buildInfo(UserHandle.getUid(user1, uid) /* uid */, packageName, 0 /* flags */, 0 /* targetSdkVersion */))); when(mPackageManagerWrapper.getInstalledApplicationsAsUser(anyInt(), eq(user2))) .thenReturn(Arrays.asList( ApplicationTestUtils.buildInfo(UserHandle.getUid(user2, uid) /* uid */, packageName, 0 /* flags */, 0 /* targetSdkVersion */))); mLoader = new InstalledAppResultLoader(mContext, mPackageManagerWrapper, query, mSiteMapManager); Set<AppSearchResult> searchResults = (Set<AppSearchResult>) mLoader.loadInBackground(); assertThat(searchResults).hasSize(2); Set<Integer> uidResults = searchResults.stream().map(result -> result.info.uid).collect( Collectors.toSet()); assertThat(uidResults).containsExactly( UserHandle.getUid(user1, uid), UserHandle.getUid(user2, uid)); } }