Fix hidden API usages in LocationAccessPolicy and add API in ActivityManager

Bug: 146355892
Test: Cts test, atest TeleServiceTests
Change-Id: I91bf8a05383f29feaa26b03d6a03ed7de2d79061
This commit is contained in:
Grace Jia
2020-01-07 14:25:24 -08:00
parent f8e29c1d60
commit 15b4c26024
3 changed files with 35 additions and 17 deletions

View File

@@ -321,6 +321,7 @@ package android.app {
method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public int getPackageImportance(String);
method @NonNull public java.util.Collection<java.util.Locale> getSupportedLocales();
method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public int getUidImportance(int);
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, "android.permission.CREATE_USERS"}) public boolean isProfileForeground(@NonNull android.os.UserHandle);
method @RequiresPermission(android.Manifest.permission.KILL_UID) public void killUid(int, String);
method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public void removeOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener);
method public void setDeviceLocales(@NonNull android.os.LocaleList);

View File

@@ -65,6 +65,7 @@ import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.UserManager;
import android.os.WorkSource;
import android.util.ArrayMap;
import android.util.DisplayMetrics;
@@ -4438,6 +4439,29 @@ public class ActivityManager {
}
}
/**
* Return if a given profile is in the foreground.
* @param userHandle UserHandle to check
* @return Returns the boolean result.
* @hide
*/
@SystemApi
@RequiresPermission(anyOf = {
android.Manifest.permission.MANAGE_USERS,
android.Manifest.permission.CREATE_USERS
})
public boolean isProfileForeground(@NonNull UserHandle userHandle) {
UserManager userManager = mContext.getSystemService(UserManager.class);
if (userManager != null) {
for (UserInfo userInfo : userManager.getProfiles(getCurrentUser())) {
if (userInfo.id == userHandle.getIdentifier()) {
return true;
}
}
}
return false;
}
/**
* The AppTask allows you to manage your own application's tasks.
* See {@link android.app.ActivityManager#getAppTasks()}

View File

@@ -24,20 +24,16 @@ import android.app.ActivityManager;
import android.app.AppOpsManager;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.UserInfo;
import android.location.LocationManager;
import android.os.Binder;
import android.os.Build;
import android.os.Process;
import android.os.UserHandle;
import android.os.UserManager;
import android.util.Log;
import android.widget.Toast;
import com.android.internal.telephony.util.TelephonyUtils;
import java.util.List;
/**
* Helper for performing location access checks.
* @hide
@@ -309,7 +305,7 @@ public final class LocationAccessPolicy {
}
private static boolean checkSystemLocationAccess(@NonNull Context context, int uid, int pid) {
if (!isLocationModeEnabled(context, UserHandle.getUserId(uid))) {
if (!isLocationModeEnabled(context, UserHandle.getUserHandleForUid(uid).getIdentifier())) {
if (DBG) Log.w(TAG, "Location disabled, failed, (" + uid + ")");
return false;
}
@@ -336,20 +332,17 @@ public final class LocationAccessPolicy {
private static boolean isCurrentProfile(@NonNull Context context, int uid) {
long token = Binder.clearCallingIdentity();
try {
final int currentUser = ActivityManager.getCurrentUser();
final int callingUserId = UserHandle.getUserId(uid);
if (callingUserId == currentUser) {
if (UserHandle.getUserHandleForUid(uid).getIdentifier()
== ActivityManager.getCurrentUser()) {
return true;
} else {
List<UserInfo> userProfiles = context.getSystemService(
UserManager.class).getProfiles(currentUser);
for (UserInfo user : userProfiles) {
if (user.id == callingUserId) {
return true;
}
}
}
return false;
ActivityManager activityManager = context.getSystemService(ActivityManager.class);
if (activityManager != null) {
return activityManager.isProfileForeground(
UserHandle.getUserHandleForUid(ActivityManager.getCurrentUser()));
} else {
return false;
}
} finally {
Binder.restoreCallingIdentity(token);
}