Proper autofill fix to let phone process autofill Settings activity.

am: 2f58b03ea1

Change-Id: Ia167badcdb5fee60a62c9cf0932150b54180ba0b
This commit is contained in:
Felipe Leme
2017-12-14 01:49:36 +00:00
committed by android-build-merger
3 changed files with 31 additions and 3 deletions

View File

@@ -263,4 +263,9 @@ public abstract class ActivityManagerInternal {
* Clears the previously saved activity manager ANR state.
*/
public abstract void clearSavedANRState();
/**
* Returns {@code true} if {@code uid} is running an activity from {@code packageName}.
*/
public abstract boolean hasRunningActivity(int uid, @Nullable String packageName);
}

View File

@@ -26,6 +26,7 @@ import static com.android.server.autofill.Helper.sVerbose;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.ActivityManagerInternal;
import android.app.AppGlobals;
import android.app.IActivityManager;
import android.content.ComponentName;
@@ -66,6 +67,7 @@ import com.android.internal.annotations.GuardedBy;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.os.HandlerCaller;
import com.android.server.LocalServices;
import com.android.server.autofill.ui.AutoFillUI;
import java.io.PrintWriter;
@@ -421,16 +423,17 @@ final class AutofillManagerServiceImpl {
* Asserts the component is owned by the caller.
*/
private void assertCallerLocked(@NonNull ComponentName componentName) {
final String packageName = componentName.getPackageName();
final PackageManager pm = mContext.getPackageManager();
final int callingUid = Binder.getCallingUid();
final int packageUid;
try {
packageUid = pm.getPackageUidAsUser(componentName.getPackageName(),
UserHandle.getCallingUserId());
packageUid = pm.getPackageUidAsUser(packageName, UserHandle.getCallingUserId());
} catch (NameNotFoundException e) {
throw new SecurityException("Could not verify UID for " + componentName);
}
if (callingUid != packageUid) {
if (callingUid != packageUid && !LocalServices.getService(ActivityManagerInternal.class)
.hasRunningActivity(callingUid, packageName)) {
final String[] packages = pm.getPackagesForUid(callingUid);
final String callingPackage = packages != null ? packages[0] : "uid-" + callingUid;
Slog.w(TAG, "App (package=" + callingPackage + ", UID=" + callingUid

View File

@@ -24143,6 +24143,26 @@ public class ActivityManagerService extends IActivityManager.Stub
mLastANRState = null;
}
}
@Override
public boolean hasRunningActivity(int uid, @Nullable String packageName) {
if (packageName == null) return false;
synchronized (ActivityManagerService.this) {
for (int i = 0; i < mLruProcesses.size(); i++) {
final ProcessRecord processRecord = mLruProcesses.get(i);
if (processRecord.uid == uid) {
for (int j = 0; j < processRecord.activities.size(); j++) {
final ActivityRecord activityRecord = processRecord.activities.get(j);
if (packageName.equals(activityRecord.packageName)) {
return true;
}
}
}
}
}
return false;
}
}
/**