Get app info with correct user id.

- when querying app info from package manager, we should use the methods
that takes the user id so that it will work properly with managed
profile.

Change-Id: Ifc84d3a29aaf7b2c1acfa096596a53f1715cc908
Fixes: 117222623
Test: make RunSettingsRoboTests
This commit is contained in:
Doris Ling
2018-10-11 16:37:32 -07:00
parent b3eaf62562
commit b9ff5892ca
12 changed files with 65 additions and 23 deletions

View File

@@ -30,7 +30,8 @@ public class DefaultBrowserShortcutPreferenceController
@Override @Override
protected boolean hasAppCapability() { protected boolean hasAppCapability() {
return DefaultBrowserPreferenceController.hasBrowserPreference(mPackageName, mContext); return DefaultBrowserPreferenceController
.hasBrowserPreference(mPackageName, mContext, UserHandle.myUserId());
} }
@Override @Override

View File

@@ -62,7 +62,7 @@ public class DefaultBrowserPicker extends DefaultAppPickerFragment {
for (ResolveInfo info : list) { for (ResolveInfo info : list) {
try { try {
candidates.add(new DefaultAppInfo(context, mPm, candidates.add(new DefaultAppInfo(context, mPm, mUserId,
mPm.getApplicationInfoAsUser(info.activityInfo.packageName, 0, mUserId))); mPm.getApplicationInfoAsUser(info.activityInfo.packageName, 0, mUserId)));
} catch (PackageManager.NameNotFoundException e) { } catch (PackageManager.NameNotFoundException e) {
// Skip unknown packages. // Skip unknown packages.

View File

@@ -29,6 +29,7 @@ import android.util.ArraySet;
import android.util.IconDrawableFactory; import android.util.IconDrawableFactory;
import android.util.Log; import android.util.Log;
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference; import androidx.preference.Preference;
import com.android.settingslib.applications.DefaultAppInfo; import com.android.settingslib.applications.DefaultAppInfo;
@@ -75,8 +76,8 @@ public class DefaultBrowserPreferenceController extends DefaultAppPreferenceCont
try { try {
final String packageName = mPackageManager.getDefaultBrowserPackageNameAsUser(mUserId); final String packageName = mPackageManager.getDefaultBrowserPackageNameAsUser(mUserId);
Log.d(TAG, "Get default browser package: " + packageName); Log.d(TAG, "Get default browser package: " + packageName);
return new DefaultAppInfo(mContext, mPackageManager, return new DefaultAppInfo(mContext, mPackageManager, mUserId,
mPackageManager.getApplicationInfo(packageName, 0)); mPackageManager.getApplicationInfoAsUser(packageName, 0, mUserId));
} catch (PackageManager.NameNotFoundException e) { } catch (PackageManager.NameNotFoundException e) {
return null; return null;
} }
@@ -143,7 +144,8 @@ public class DefaultBrowserPreferenceController extends DefaultAppPreferenceCont
return null; return null;
} }
private Drawable getOnlyAppIcon() { @VisibleForTesting
Drawable getOnlyAppIcon() {
final List<ResolveInfo> list = getCandidates(mPackageManager, mUserId); final List<ResolveInfo> list = getCandidates(mPackageManager, mUserId);
if (list != null && list.size() == 1) { if (list != null && list.size() == 1) {
final ResolveInfo info = list.get(0); final ResolveInfo info = list.get(0);
@@ -154,7 +156,7 @@ public class DefaultBrowserPreferenceController extends DefaultAppPreferenceCont
} }
final ApplicationInfo appInfo; final ApplicationInfo appInfo;
try { try {
appInfo = mPackageManager.getApplicationInfo(packageName, 0); appInfo = mPackageManager.getApplicationInfoAsUser(packageName, 0, mUserId);
} catch (PackageManager.NameNotFoundException e) { } catch (PackageManager.NameNotFoundException e) {
Log.w(TAG, "Error getting app info for " + packageName); Log.w(TAG, "Error getting app info for " + packageName);
return null; return null;
@@ -169,11 +171,11 @@ public class DefaultBrowserPreferenceController extends DefaultAppPreferenceCont
/** /**
* Whether or not the pkg contains browser capability * Whether or not the pkg contains browser capability
*/ */
public static boolean hasBrowserPreference(String pkg, Context context) { public static boolean hasBrowserPreference(String pkg, Context context, int userId) {
final Intent intent = new Intent(BROWSE_PROBE); final Intent intent = new Intent(BROWSE_PROBE);
intent.setPackage(pkg); intent.setPackage(pkg);
final List<ResolveInfo> resolveInfos = final List<ResolveInfo> resolveInfos = context.getPackageManager()
context.getPackageManager().queryIntentActivities(intent, 0); .queryIntentActivitiesAsUser(intent, 0 /* flags */, userId);
return resolveInfos != null && resolveInfos.size() != 0; return resolveInfos != null && resolveInfos.size() != 0;
} }

View File

@@ -58,7 +58,7 @@ public class DefaultEmergencyPicker extends DefaultAppPickerFragment {
final PackageInfo packageInfo = final PackageInfo packageInfo =
mPm.getPackageInfo(info.activityInfo.packageName, 0); mPm.getPackageInfo(info.activityInfo.packageName, 0);
final ApplicationInfo appInfo = packageInfo.applicationInfo; final ApplicationInfo appInfo = packageInfo.applicationInfo;
candidates.add(new DefaultAppInfo(context, mPm, appInfo)); candidates.add(new DefaultAppInfo(context, mPm, mUserId, appInfo));
// Get earliest installed system app. // Get earliest installed system app.
if (isSystemApp(appInfo) && (bestMatch == null || if (isSystemApp(appInfo) && (bestMatch == null ||
bestMatch.firstInstallTime > packageInfo.firstInstallTime)) { bestMatch.firstInstallTime > packageInfo.firstInstallTime)) {

View File

@@ -58,7 +58,7 @@ public class DefaultPhonePicker extends DefaultAppPickerFragment {
final Context context = getContext(); final Context context = getContext();
for (String packageName : dialerPackages) { for (String packageName : dialerPackages) {
try { try {
candidates.add(new DefaultAppInfo(context, mPm, candidates.add(new DefaultAppInfo(context, mPm, mUserId,
mPm.getApplicationInfoAsUser(packageName, 0, mUserId))); mPm.getApplicationInfoAsUser(packageName, 0, mUserId)));
} catch (PackageManager.NameNotFoundException e) { } catch (PackageManager.NameNotFoundException e) {
// Skip unknown packages. // Skip unknown packages.

View File

@@ -59,7 +59,8 @@ public class DefaultPhonePreferenceController extends DefaultAppPreferenceContro
@Override @Override
protected DefaultAppInfo getDefaultAppInfo() { protected DefaultAppInfo getDefaultAppInfo() {
try { try {
return new DefaultAppInfo(mContext, mPackageManager, mPackageManager.getApplicationInfo( return new DefaultAppInfo(mContext, mPackageManager, mUserId,
mPackageManager.getApplicationInfo(
DefaultDialerManager.getDefaultDialerApplication(mContext, mUserId), 0)); DefaultDialerManager.getDefaultDialerApplication(mContext, mUserId), 0));
} catch (PackageManager.NameNotFoundException e) { } catch (PackageManager.NameNotFoundException e) {
return null; return null;

View File

@@ -55,7 +55,7 @@ public class DefaultSmsPicker extends DefaultAppPickerFragment {
for (SmsApplication.SmsApplicationData smsApplicationData : smsApplications) { for (SmsApplication.SmsApplicationData smsApplicationData : smsApplications) {
try { try {
candidates.add(new DefaultAppInfo(context, mPm, candidates.add(new DefaultAppInfo(context, mPm, mUserId,
mPm.getApplicationInfoAsUser(smsApplicationData.mPackageName, 0, mUserId))); mPm.getApplicationInfoAsUser(smsApplicationData.mPackageName, 0, mUserId)));
} catch (PackageManager.NameNotFoundException e) { } catch (PackageManager.NameNotFoundException e) {
// Skip unknown packages. // Skip unknown packages.

View File

@@ -19,6 +19,7 @@ package com.android.settings.development;
import android.content.Context; import android.content.Context;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.os.UserHandle;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
@@ -66,7 +67,7 @@ public class WebViewAppPreferenceController extends DeveloperOptionsPreferenceCo
@VisibleForTesting @VisibleForTesting
DefaultAppInfo getDefaultAppInfo() { DefaultAppInfo getDefaultAppInfo() {
final PackageInfo currentPackage = mWebViewUpdateServiceWrapper.getCurrentWebViewPackage(); final PackageInfo currentPackage = mWebViewUpdateServiceWrapper.getCurrentWebViewPackage();
return new DefaultAppInfo(mContext, mPackageManager, return new DefaultAppInfo(mContext, mPackageManager, UserHandle.myUserId(),
currentPackage == null ? null : currentPackage.applicationInfo); currentPackage == null ? null : currentPackage.applicationInfo);
} }

View File

@@ -118,9 +118,9 @@ public class WebViewAppPicker extends DefaultAppPickerFragment {
} }
private static class WebViewAppInfo extends DefaultAppInfo { private static class WebViewAppInfo extends DefaultAppInfo {
public WebViewAppInfo(Context context, PackageManager pm, public WebViewAppInfo(Context context, PackageManager pm, int userId,
PackageItemInfo packageItemInfo, String summary, boolean enabled) { PackageItemInfo packageItemInfo, String summary, boolean enabled) {
super(context, pm, packageItemInfo, summary, enabled); super(context, pm, userId, packageItemInfo, summary, enabled);
} }
@Override @Override
@@ -138,7 +138,7 @@ public class WebViewAppPicker extends DefaultAppPickerFragment {
@VisibleForTesting @VisibleForTesting
DefaultAppInfo createDefaultAppInfo(Context context, PackageManager pm, DefaultAppInfo createDefaultAppInfo(Context context, PackageManager pm,
PackageItemInfo packageItemInfo, String disabledReason) { PackageItemInfo packageItemInfo, String disabledReason) {
return new WebViewAppInfo(context, pm, packageItemInfo, disabledReason, return new WebViewAppInfo(context, pm, mUserId, packageItemInfo, disabledReason,
TextUtils.isEmpty(disabledReason) /* enabled */); TextUtils.isEmpty(disabledReason) /* enabled */);
} }

View File

@@ -43,12 +43,11 @@ import com.android.settingslib.applications.ApplicationsState.AppEntry;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock;import android.net.INetworkStatsSession; import org.mockito.Mock;
import android.util.FeatureFlagUtils; import android.util.FeatureFlagUtils;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
import org.robolectric.util.ReflectionHelpers;
import androidx.loader.app.LoaderManager; import androidx.loader.app.LoaderManager;
import androidx.preference.Preference; import androidx.preference.Preference;

View File

@@ -18,8 +18,8 @@ package com.android.settings.applications.appinfo;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Matchers.anyInt;
import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.Matchers.argThat;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@@ -66,8 +66,8 @@ public class DefaultBrowserShortcutPreferenceControllerTest {
public void hasAppCapability_hasBrowserCapability_shouldReturnTrue() { public void hasAppCapability_hasBrowserCapability_shouldReturnTrue() {
List<ResolveInfo> resolveInfos = new ArrayList<>(); List<ResolveInfo> resolveInfos = new ArrayList<>();
resolveInfos.add(new ResolveInfo()); resolveInfos.add(new ResolveInfo());
when(mPackageManager.queryIntentActivities(argThat(intent-> intent != null when(mPackageManager.queryIntentActivitiesAsUser(argThat(intent-> intent != null
&& intent.getCategories().contains(Intent.CATEGORY_BROWSABLE)), anyInt())) && intent.getCategories().contains(Intent.CATEGORY_BROWSABLE)), anyInt(), anyInt()))
.thenReturn(resolveInfos); .thenReturn(resolveInfos);
assertThat(mController.hasAppCapability()).isTrue(); assertThat(mController.hasAppCapability()).isTrue();

View File

@@ -34,6 +34,7 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo;
import android.content.res.Resources;
import android.os.UserManager; import android.os.UserManager;
import androidx.preference.Preference; import androidx.preference.Preference;
@@ -130,6 +131,16 @@ public class DefaultBrowserPreferenceControllerTest {
verify(mPackageManager).getDefaultBrowserPackageNameAsUser(anyInt()); verify(mPackageManager).getDefaultBrowserPackageNameAsUser(anyInt());
} }
@Test
public void getDefaultApp_shouldGetApplicationInfoAsUser() throws NameNotFoundException {
final String PACKAGE_NAME = "com.test.package";
when(mPackageManager.getDefaultBrowserPackageNameAsUser(anyInt())).thenReturn(PACKAGE_NAME);
mController.getDefaultAppInfo();
verify(mPackageManager).getApplicationInfoAsUser(eq(PACKAGE_NAME), anyInt(), anyInt());
}
@Test @Test
public void isBrowserDefault_onlyApp_shouldReturnTrue() { public void isBrowserDefault_onlyApp_shouldReturnTrue() {
when(mPackageManager.getDefaultBrowserPackageNameAsUser(anyInt())).thenReturn(null); when(mPackageManager.getDefaultBrowserPackageNameAsUser(anyInt())).thenReturn(null);
@@ -173,6 +184,33 @@ public class DefaultBrowserPreferenceControllerTest {
any(Intent.class), eq(0) /* flags */, eq(0) /* userId */); any(Intent.class), eq(0) /* flags */, eq(0) /* userId */);
} }
@Test
public void getOnlyAppIcon_shouldGetApplicationInfoAsUser() throws NameNotFoundException {
final List<ResolveInfo> resolveInfos = new ArrayList<>();
final String PACKAGE_NAME = "com.test.package";
resolveInfos.add(createResolveInfo(PACKAGE_NAME));
when(mPackageManager.queryIntentActivitiesAsUser(any(Intent.class), anyInt(), anyInt()))
.thenReturn(resolveInfos);
when(mContext.getPackageManager()).thenReturn(mPackageManager);
when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager);
when(mContext.getResources()).thenReturn(mock(Resources.class));
mController.getOnlyAppIcon();
verify(mPackageManager).getApplicationInfoAsUser(
eq(PACKAGE_NAME), eq(0) /* flags */, eq(0) /* userId */);
}
@Test
public void hasBrowserPreference_shouldQueryIntentActivitiesAsUser() {
when(mContext.getPackageManager()).thenReturn(mPackageManager);
mController.hasBrowserPreference("com.test.package", mContext, 0 /* userId */);
verify(mPackageManager).queryIntentActivitiesAsUser(
any(Intent.class), eq(0) /* flags */, eq(0) /* userId */);
}
private ResolveInfo createResolveInfo(String packageName) { private ResolveInfo createResolveInfo(String packageName) {
final ResolveInfo info = new ResolveInfo(); final ResolveInfo info = new ResolveInfo();
info.handleAllWebDataURI = true; info.handleAllWebDataURI = true;