Loading core/java/android/app/IUiAutomationConnection.aidl +2 −0 Original line number Diff line number Diff line Loading @@ -43,6 +43,8 @@ interface IUiAutomationConnection { void clearWindowAnimationFrameStats(); WindowAnimationFrameStats getWindowAnimationFrameStats(); void executeShellCommand(String command, in ParcelFileDescriptor fd); void grantRuntimePermission(String packageName, String permission, int userId); void revokeRuntimePermission(String packageName, String permission, int userId); // Called from the system process. oneway void shutdown(); Loading core/java/android/app/UiAutomation.java +57 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.os.Looper; import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.os.SystemClock; import android.os.UserHandle; import android.util.Log; import android.view.Display; import android.view.InputEvent; Loading Loading @@ -845,6 +846,62 @@ public final class UiAutomation { return null; } /** * Grants a runtime permission to a package for a user. * @param packageName The package to which to grant. * @param permission The permission to grant. * @return Whether granting succeeded. * * @hide */ public boolean grantRuntimePermission(String packageName, String permission, UserHandle userHandle) { synchronized (mLock) { throwIfNotConnectedLocked(); } try { if (DEBUG) { Log.i(LOG_TAG, "Granting runtime permission"); } // Calling out without a lock held. mUiAutomationConnection.grantRuntimePermission(packageName, permission, userHandle.getIdentifier()); // TODO: The package manager API should return boolean. return true; } catch (RemoteException re) { Log.e(LOG_TAG, "Error granting runtime permission", re); } return false; } /** * Revokes a runtime permission from a package for a user. * @param packageName The package from which to revoke. * @param permission The permission to revoke. * @return Whether revoking succeeded. * * @hide */ public boolean revokeRuntimePermission(String packageName, String permission, UserHandle userHandle) { synchronized (mLock) { throwIfNotConnectedLocked(); } try { if (DEBUG) { Log.i(LOG_TAG, "Revoking runtime permission"); } // Calling out without a lock held. mUiAutomationConnection.revokeRuntimePermission(packageName, permission, userHandle.getIdentifier()); // TODO: The package manager API should return boolean. return true; } catch (RemoteException re) { Log.e(LOG_TAG, "Error revoking runtime permission", re); } return false; } /** * Executes a shell command. This method returs a file descriptor that points * to the standard output stream. The command execution is similar to running Loading core/java/android/app/UiAutomationConnection.java +36 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package android.app; import android.accessibilityservice.AccessibilityServiceInfo; import android.accessibilityservice.IAccessibilityServiceClient; import android.content.Context; import android.content.pm.IPackageManager; import android.graphics.Bitmap; import android.hardware.input.InputManager; import android.os.Binder; Loading Loading @@ -60,6 +61,9 @@ public final class UiAutomationConnection extends IUiAutomationConnection.Stub { private final IAccessibilityManager mAccessibilityManager = IAccessibilityManager.Stub .asInterface(ServiceManager.getService(Service.ACCESSIBILITY_SERVICE)); private final IPackageManager mPackageManager = IPackageManager.Stub .asInterface(ServiceManager.getService("package")); private final Object mLock = new Object(); private final Binder mToken = new Binder(); Loading Loading @@ -226,6 +230,38 @@ public final class UiAutomationConnection extends IUiAutomationConnection.Stub { } } @Override public void grantRuntimePermission(String packageName, String permission, int userId) throws RemoteException { synchronized (mLock) { throwIfCalledByNotTrustedUidLocked(); throwIfShutdownLocked(); throwIfNotConnectedLocked(); } final long identity = Binder.clearCallingIdentity(); try { mPackageManager.grantRuntimePermission(packageName, permission, userId); } finally { Binder.restoreCallingIdentity(identity); } } @Override public void revokeRuntimePermission(String packageName, String permission, int userId) throws RemoteException { synchronized (mLock) { throwIfCalledByNotTrustedUidLocked(); throwIfShutdownLocked(); throwIfNotConnectedLocked(); } final long identity = Binder.clearCallingIdentity(); try { mPackageManager.revokeRuntimePermission(packageName, permission, userId); } finally { Binder.restoreCallingIdentity(identity); } } @Override public void executeShellCommand(final String command, final ParcelFileDescriptor sink) throws RemoteException { Loading core/java/com/android/internal/util/ArrayUtils.java +23 −0 Original line number Diff line number Diff line Loading @@ -293,6 +293,29 @@ public class ArrayUtils { return cur; } /** * Removes value from given array if present, providing set-like behavior. */ public static @Nullable String[] removeString(@Nullable String[] cur, String val) { if (cur == null) { return null; } final int N = cur.length; for (int i = 0; i < N; i++) { if (Objects.equals(cur[i], val)) { String[] ret = new String[N - 1]; if (i > 0) { System.arraycopy(cur, 0, ret, 0, i); } if (i < (N - 1)) { System.arraycopy(cur, i + 1, ret, i, N - i - 1); } return ret; } } return cur; } /** * Adds value to given array if not already present, providing set-like * behavior. Loading services/core/java/com/android/server/content/ContentService.java +1 −1 Original line number Diff line number Diff line Loading @@ -157,7 +157,7 @@ public final class ContentService extends IContentService.Stub { mFactoryTest = factoryTest; // Let the package manager query for the sync adapters for a given authority // as we grant default permissions to sync adapters for specifix authorities. // as we grant default permissions to sync adapters for specific authorities. PackageManagerInternal packageManagerInternal = LocalServices.getService( PackageManagerInternal.class); packageManagerInternal.setSyncAdapterPackagesprovider( Loading Loading
core/java/android/app/IUiAutomationConnection.aidl +2 −0 Original line number Diff line number Diff line Loading @@ -43,6 +43,8 @@ interface IUiAutomationConnection { void clearWindowAnimationFrameStats(); WindowAnimationFrameStats getWindowAnimationFrameStats(); void executeShellCommand(String command, in ParcelFileDescriptor fd); void grantRuntimePermission(String packageName, String permission, int userId); void revokeRuntimePermission(String packageName, String permission, int userId); // Called from the system process. oneway void shutdown(); Loading
core/java/android/app/UiAutomation.java +57 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.os.Looper; import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.os.SystemClock; import android.os.UserHandle; import android.util.Log; import android.view.Display; import android.view.InputEvent; Loading Loading @@ -845,6 +846,62 @@ public final class UiAutomation { return null; } /** * Grants a runtime permission to a package for a user. * @param packageName The package to which to grant. * @param permission The permission to grant. * @return Whether granting succeeded. * * @hide */ public boolean grantRuntimePermission(String packageName, String permission, UserHandle userHandle) { synchronized (mLock) { throwIfNotConnectedLocked(); } try { if (DEBUG) { Log.i(LOG_TAG, "Granting runtime permission"); } // Calling out without a lock held. mUiAutomationConnection.grantRuntimePermission(packageName, permission, userHandle.getIdentifier()); // TODO: The package manager API should return boolean. return true; } catch (RemoteException re) { Log.e(LOG_TAG, "Error granting runtime permission", re); } return false; } /** * Revokes a runtime permission from a package for a user. * @param packageName The package from which to revoke. * @param permission The permission to revoke. * @return Whether revoking succeeded. * * @hide */ public boolean revokeRuntimePermission(String packageName, String permission, UserHandle userHandle) { synchronized (mLock) { throwIfNotConnectedLocked(); } try { if (DEBUG) { Log.i(LOG_TAG, "Revoking runtime permission"); } // Calling out without a lock held. mUiAutomationConnection.revokeRuntimePermission(packageName, permission, userHandle.getIdentifier()); // TODO: The package manager API should return boolean. return true; } catch (RemoteException re) { Log.e(LOG_TAG, "Error revoking runtime permission", re); } return false; } /** * Executes a shell command. This method returs a file descriptor that points * to the standard output stream. The command execution is similar to running Loading
core/java/android/app/UiAutomationConnection.java +36 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package android.app; import android.accessibilityservice.AccessibilityServiceInfo; import android.accessibilityservice.IAccessibilityServiceClient; import android.content.Context; import android.content.pm.IPackageManager; import android.graphics.Bitmap; import android.hardware.input.InputManager; import android.os.Binder; Loading Loading @@ -60,6 +61,9 @@ public final class UiAutomationConnection extends IUiAutomationConnection.Stub { private final IAccessibilityManager mAccessibilityManager = IAccessibilityManager.Stub .asInterface(ServiceManager.getService(Service.ACCESSIBILITY_SERVICE)); private final IPackageManager mPackageManager = IPackageManager.Stub .asInterface(ServiceManager.getService("package")); private final Object mLock = new Object(); private final Binder mToken = new Binder(); Loading Loading @@ -226,6 +230,38 @@ public final class UiAutomationConnection extends IUiAutomationConnection.Stub { } } @Override public void grantRuntimePermission(String packageName, String permission, int userId) throws RemoteException { synchronized (mLock) { throwIfCalledByNotTrustedUidLocked(); throwIfShutdownLocked(); throwIfNotConnectedLocked(); } final long identity = Binder.clearCallingIdentity(); try { mPackageManager.grantRuntimePermission(packageName, permission, userId); } finally { Binder.restoreCallingIdentity(identity); } } @Override public void revokeRuntimePermission(String packageName, String permission, int userId) throws RemoteException { synchronized (mLock) { throwIfCalledByNotTrustedUidLocked(); throwIfShutdownLocked(); throwIfNotConnectedLocked(); } final long identity = Binder.clearCallingIdentity(); try { mPackageManager.revokeRuntimePermission(packageName, permission, userId); } finally { Binder.restoreCallingIdentity(identity); } } @Override public void executeShellCommand(final String command, final ParcelFileDescriptor sink) throws RemoteException { Loading
core/java/com/android/internal/util/ArrayUtils.java +23 −0 Original line number Diff line number Diff line Loading @@ -293,6 +293,29 @@ public class ArrayUtils { return cur; } /** * Removes value from given array if present, providing set-like behavior. */ public static @Nullable String[] removeString(@Nullable String[] cur, String val) { if (cur == null) { return null; } final int N = cur.length; for (int i = 0; i < N; i++) { if (Objects.equals(cur[i], val)) { String[] ret = new String[N - 1]; if (i > 0) { System.arraycopy(cur, 0, ret, 0, i); } if (i < (N - 1)) { System.arraycopy(cur, i + 1, ret, i, N - i - 1); } return ret; } } return cur; } /** * Adds value to given array if not already present, providing set-like * behavior. Loading
services/core/java/com/android/server/content/ContentService.java +1 −1 Original line number Diff line number Diff line Loading @@ -157,7 +157,7 @@ public final class ContentService extends IContentService.Stub { mFactoryTest = factoryTest; // Let the package manager query for the sync adapters for a given authority // as we grant default permissions to sync adapters for specifix authorities. // as we grant default permissions to sync adapters for specific authorities. PackageManagerInternal packageManagerInternal = LocalServices.getService( PackageManagerInternal.class); packageManagerInternal.setSyncAdapterPackagesprovider( Loading