Loading core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl +5 −5 Original line number Diff line number Diff line Loading @@ -35,22 +35,22 @@ interface IAccessibilityServiceConnection { void setServiceInfo(in AccessibilityServiceInfo info); boolean findAccessibilityNodeInfoByAccessibilityId(int accessibilityWindowId, String[] findAccessibilityNodeInfoByAccessibilityId(int accessibilityWindowId, long accessibilityNodeId, int interactionId, IAccessibilityInteractionConnectionCallback callback, int flags, long threadId); boolean findAccessibilityNodeInfosByText(int accessibilityWindowId, long accessibilityNodeId, String[] findAccessibilityNodeInfosByText(int accessibilityWindowId, long accessibilityNodeId, String text, int interactionId, IAccessibilityInteractionConnectionCallback callback, long threadId); boolean findAccessibilityNodeInfosByViewId(int accessibilityWindowId, String[] findAccessibilityNodeInfosByViewId(int accessibilityWindowId, long accessibilityNodeId, String viewId, int interactionId, IAccessibilityInteractionConnectionCallback callback, long threadId); boolean findFocus(int accessibilityWindowId, long accessibilityNodeId, int focusType, String[] findFocus(int accessibilityWindowId, long accessibilityNodeId, int focusType, int interactionId, IAccessibilityInteractionConnectionCallback callback, long threadId); boolean focusSearch(int accessibilityWindowId, long accessibilityNodeId, int direction, String[] focusSearch(int accessibilityWindowId, long accessibilityNodeId, int direction, int interactionId, IAccessibilityInteractionConnectionCallback callback, long threadId); boolean performAccessibilityAction(int accessibilityWindowId, long accessibilityNodeId, Loading core/java/android/appwidget/AppWidgetManagerInternal.java 0 → 100644 +39 −0 Original line number Diff line number Diff line /* * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.appwidget; import android.annotation.NonNull; import android.annotation.Nullable; import android.util.ArraySet; import java.util.Set; /** * App widget manager local system service interface. * * @hide Only for use within the system server. */ public abstract class AppWidgetManagerInternal { /** * Gets the packages from which the uid hosts widgets. * * @param uid The potential host UID. * @return Whether the UID hosts widgets from the package. */ public abstract @Nullable ArraySet<String> getHostedWidgetPackages(int uid); } core/java/android/os/UserHandle.java +5 −0 Original line number Diff line number Diff line Loading @@ -155,6 +155,11 @@ public final class UserHandle implements Parcelable { return getUserId(Binder.getCallingUid()); } /** @hide */ public static @AppIdInt int getCallingAppId() { return getAppId(Binder.getCallingUid()); } /** @hide */ @SystemApi public static UserHandle of(@UserIdInt int userId) { Loading core/java/android/view/ViewRootImpl.java +1 −0 Original line number Diff line number Diff line Loading @@ -7294,6 +7294,7 @@ public final class ViewRootImpl implements ViewParent, if (!registered) { mAttachInfo.mAccessibilityWindowId = mAccessibilityManager.addAccessibilityInteractionConnection(mWindow, mContext.getPackageName(), new AccessibilityInteractionConnection(ViewRootImpl.this)); } } Loading core/java/android/view/accessibility/AccessibilityInteractionClient.java +83 −36 Original line number Diff line number Diff line Loading @@ -28,6 +28,8 @@ import android.util.Log; import android.util.LongSparseArray; import android.util.SparseArray; import com.android.internal.util.ArrayUtils; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; Loading Loading @@ -283,16 +285,23 @@ public final class AccessibilityInteractionClient } final int interactionId = mInteractionIdCounter.getAndIncrement(); final long identityToken = Binder.clearCallingIdentity(); final boolean success = connection.findAccessibilityNodeInfoByAccessibilityId( final String[] packageNames; try { packageNames = connection.findAccessibilityNodeInfoByAccessibilityId( accessibilityWindowId, accessibilityNodeId, interactionId, this, prefetchFlags, Thread.currentThread().getId()); } finally { Binder.restoreCallingIdentity(identityToken); // If the scale is zero the call has failed. if (success) { } if (packageNames != null) { List<AccessibilityNodeInfo> infos = getFindAccessibilityNodeInfosResultAndClear( interactionId); finalizeAndCacheAccessibilityNodeInfos(infos, connectionId); finalizeAndCacheAccessibilityNodeInfos(infos, connectionId, bypassCache, packageNames); if (infos != null && !infos.isEmpty()) { for (int i = 1; i < infos.size(); i++) { infos.get(i).recycle(); } return infos.get(0); } } Loading Loading @@ -331,15 +340,21 @@ public final class AccessibilityInteractionClient if (connection != null) { final int interactionId = mInteractionIdCounter.getAndIncrement(); final long identityToken = Binder.clearCallingIdentity(); final boolean success = connection.findAccessibilityNodeInfosByViewId( final String[] packageNames; try { packageNames = connection.findAccessibilityNodeInfosByViewId( accessibilityWindowId, accessibilityNodeId, viewId, interactionId, this, Thread.currentThread().getId()); } finally { Binder.restoreCallingIdentity(identityToken); if (success) { } if (packageNames != null) { List<AccessibilityNodeInfo> infos = getFindAccessibilityNodeInfosResultAndClear( interactionId); if (infos != null) { finalizeAndCacheAccessibilityNodeInfos(infos, connectionId); finalizeAndCacheAccessibilityNodeInfos(infos, connectionId, false, packageNames); return infos; } } Loading Loading @@ -379,15 +394,21 @@ public final class AccessibilityInteractionClient if (connection != null) { final int interactionId = mInteractionIdCounter.getAndIncrement(); final long identityToken = Binder.clearCallingIdentity(); final boolean success = connection.findAccessibilityNodeInfosByText( final String[] packageNames; try { packageNames = connection.findAccessibilityNodeInfosByText( accessibilityWindowId, accessibilityNodeId, text, interactionId, this, Thread.currentThread().getId()); } finally { Binder.restoreCallingIdentity(identityToken); if (success) { } if (packageNames != null) { List<AccessibilityNodeInfo> infos = getFindAccessibilityNodeInfosResultAndClear( interactionId); if (infos != null) { finalizeAndCacheAccessibilityNodeInfos(infos, connectionId); finalizeAndCacheAccessibilityNodeInfos(infos, connectionId, false, packageNames); return infos; } } Loading Loading @@ -426,14 +447,19 @@ public final class AccessibilityInteractionClient if (connection != null) { final int interactionId = mInteractionIdCounter.getAndIncrement(); final long identityToken = Binder.clearCallingIdentity(); final boolean success = connection.findFocus(accessibilityWindowId, final String[] packageNames; try { packageNames = connection.findFocus(accessibilityWindowId, accessibilityNodeId, focusType, interactionId, this, Thread.currentThread().getId()); } finally { Binder.restoreCallingIdentity(identityToken); if (success) { } if (packageNames != null) { AccessibilityNodeInfo info = getFindAccessibilityNodeInfoResultAndClear( interactionId); finalizeAndCacheAccessibilityNodeInfo(info, connectionId); finalizeAndCacheAccessibilityNodeInfo(info, connectionId, false, packageNames); return info; } } else { Loading Loading @@ -470,14 +496,19 @@ public final class AccessibilityInteractionClient if (connection != null) { final int interactionId = mInteractionIdCounter.getAndIncrement(); final long identityToken = Binder.clearCallingIdentity(); final boolean success = connection.focusSearch(accessibilityWindowId, final String[] packageNames; try { packageNames = connection.focusSearch(accessibilityWindowId, accessibilityNodeId, direction, interactionId, this, Thread.currentThread().getId()); } finally { Binder.restoreCallingIdentity(identityToken); if (success) { } if (packageNames != null) { AccessibilityNodeInfo info = getFindAccessibilityNodeInfoResultAndClear( interactionId); finalizeAndCacheAccessibilityNodeInfo(info, connectionId); finalizeAndCacheAccessibilityNodeInfo(info, connectionId, false, packageNames); return info; } } else { Loading Loading @@ -578,7 +609,7 @@ public final class AccessibilityInteractionClient int interactionId) { synchronized (mInstanceLock) { final boolean success = waitForResultTimedLocked(interactionId); List<AccessibilityNodeInfo> result = null; final List<AccessibilityNodeInfo> result; if (success) { result = mFindAccessibilityNodeInfosResult; } else { Loading Loading @@ -694,29 +725,45 @@ public final class AccessibilityInteractionClient * * @param info The info. * @param connectionId The id of the connection to the system. * @param bypassCache Whether or not to bypass the cache. The node is added to the cache if * this value is {@code false} * @param packageNames The valid package names a node can come from. */ private void finalizeAndCacheAccessibilityNodeInfo(AccessibilityNodeInfo info, int connectionId) { int connectionId, boolean bypassCache, String[] packageNames) { if (info != null) { info.setConnectionId(connectionId); // Empty array means any package name is Okay if (!ArrayUtils.isEmpty(packageNames) && !ArrayUtils.contains(packageNames, info.getPackageName().toString())) { // If the node package not one of the valid ones, pick the top one - this // is one of the packages running in the introspected UID. info.setPackageName(packageNames[0]); } info.setSealed(true); if (!bypassCache) { sAccessibilityCache.add(info); } } } /** * Finalize {@link AccessibilityNodeInfo}s before passing them to the client. * * @param infos The {@link AccessibilityNodeInfo}s. * @param connectionId The id of the connection to the system. * @param bypassCache Whether or not to bypass the cache. The nodes are added to the cache if * this value is {@code false} * @param packageNames The valid package names a node can come from. */ private void finalizeAndCacheAccessibilityNodeInfos(List<AccessibilityNodeInfo> infos, int connectionId) { int connectionId, boolean bypassCache, String[] packageNames) { if (infos != null) { final int infosCount = infos.size(); for (int i = 0; i < infosCount; i++) { AccessibilityNodeInfo info = infos.get(i); finalizeAndCacheAccessibilityNodeInfo(info, connectionId); finalizeAndCacheAccessibilityNodeInfo(info, connectionId, bypassCache, packageNames); } } } Loading Loading
core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl +5 −5 Original line number Diff line number Diff line Loading @@ -35,22 +35,22 @@ interface IAccessibilityServiceConnection { void setServiceInfo(in AccessibilityServiceInfo info); boolean findAccessibilityNodeInfoByAccessibilityId(int accessibilityWindowId, String[] findAccessibilityNodeInfoByAccessibilityId(int accessibilityWindowId, long accessibilityNodeId, int interactionId, IAccessibilityInteractionConnectionCallback callback, int flags, long threadId); boolean findAccessibilityNodeInfosByText(int accessibilityWindowId, long accessibilityNodeId, String[] findAccessibilityNodeInfosByText(int accessibilityWindowId, long accessibilityNodeId, String text, int interactionId, IAccessibilityInteractionConnectionCallback callback, long threadId); boolean findAccessibilityNodeInfosByViewId(int accessibilityWindowId, String[] findAccessibilityNodeInfosByViewId(int accessibilityWindowId, long accessibilityNodeId, String viewId, int interactionId, IAccessibilityInteractionConnectionCallback callback, long threadId); boolean findFocus(int accessibilityWindowId, long accessibilityNodeId, int focusType, String[] findFocus(int accessibilityWindowId, long accessibilityNodeId, int focusType, int interactionId, IAccessibilityInteractionConnectionCallback callback, long threadId); boolean focusSearch(int accessibilityWindowId, long accessibilityNodeId, int direction, String[] focusSearch(int accessibilityWindowId, long accessibilityNodeId, int direction, int interactionId, IAccessibilityInteractionConnectionCallback callback, long threadId); boolean performAccessibilityAction(int accessibilityWindowId, long accessibilityNodeId, Loading
core/java/android/appwidget/AppWidgetManagerInternal.java 0 → 100644 +39 −0 Original line number Diff line number Diff line /* * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.appwidget; import android.annotation.NonNull; import android.annotation.Nullable; import android.util.ArraySet; import java.util.Set; /** * App widget manager local system service interface. * * @hide Only for use within the system server. */ public abstract class AppWidgetManagerInternal { /** * Gets the packages from which the uid hosts widgets. * * @param uid The potential host UID. * @return Whether the UID hosts widgets from the package. */ public abstract @Nullable ArraySet<String> getHostedWidgetPackages(int uid); }
core/java/android/os/UserHandle.java +5 −0 Original line number Diff line number Diff line Loading @@ -155,6 +155,11 @@ public final class UserHandle implements Parcelable { return getUserId(Binder.getCallingUid()); } /** @hide */ public static @AppIdInt int getCallingAppId() { return getAppId(Binder.getCallingUid()); } /** @hide */ @SystemApi public static UserHandle of(@UserIdInt int userId) { Loading
core/java/android/view/ViewRootImpl.java +1 −0 Original line number Diff line number Diff line Loading @@ -7294,6 +7294,7 @@ public final class ViewRootImpl implements ViewParent, if (!registered) { mAttachInfo.mAccessibilityWindowId = mAccessibilityManager.addAccessibilityInteractionConnection(mWindow, mContext.getPackageName(), new AccessibilityInteractionConnection(ViewRootImpl.this)); } } Loading
core/java/android/view/accessibility/AccessibilityInteractionClient.java +83 −36 Original line number Diff line number Diff line Loading @@ -28,6 +28,8 @@ import android.util.Log; import android.util.LongSparseArray; import android.util.SparseArray; import com.android.internal.util.ArrayUtils; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; Loading Loading @@ -283,16 +285,23 @@ public final class AccessibilityInteractionClient } final int interactionId = mInteractionIdCounter.getAndIncrement(); final long identityToken = Binder.clearCallingIdentity(); final boolean success = connection.findAccessibilityNodeInfoByAccessibilityId( final String[] packageNames; try { packageNames = connection.findAccessibilityNodeInfoByAccessibilityId( accessibilityWindowId, accessibilityNodeId, interactionId, this, prefetchFlags, Thread.currentThread().getId()); } finally { Binder.restoreCallingIdentity(identityToken); // If the scale is zero the call has failed. if (success) { } if (packageNames != null) { List<AccessibilityNodeInfo> infos = getFindAccessibilityNodeInfosResultAndClear( interactionId); finalizeAndCacheAccessibilityNodeInfos(infos, connectionId); finalizeAndCacheAccessibilityNodeInfos(infos, connectionId, bypassCache, packageNames); if (infos != null && !infos.isEmpty()) { for (int i = 1; i < infos.size(); i++) { infos.get(i).recycle(); } return infos.get(0); } } Loading Loading @@ -331,15 +340,21 @@ public final class AccessibilityInteractionClient if (connection != null) { final int interactionId = mInteractionIdCounter.getAndIncrement(); final long identityToken = Binder.clearCallingIdentity(); final boolean success = connection.findAccessibilityNodeInfosByViewId( final String[] packageNames; try { packageNames = connection.findAccessibilityNodeInfosByViewId( accessibilityWindowId, accessibilityNodeId, viewId, interactionId, this, Thread.currentThread().getId()); } finally { Binder.restoreCallingIdentity(identityToken); if (success) { } if (packageNames != null) { List<AccessibilityNodeInfo> infos = getFindAccessibilityNodeInfosResultAndClear( interactionId); if (infos != null) { finalizeAndCacheAccessibilityNodeInfos(infos, connectionId); finalizeAndCacheAccessibilityNodeInfos(infos, connectionId, false, packageNames); return infos; } } Loading Loading @@ -379,15 +394,21 @@ public final class AccessibilityInteractionClient if (connection != null) { final int interactionId = mInteractionIdCounter.getAndIncrement(); final long identityToken = Binder.clearCallingIdentity(); final boolean success = connection.findAccessibilityNodeInfosByText( final String[] packageNames; try { packageNames = connection.findAccessibilityNodeInfosByText( accessibilityWindowId, accessibilityNodeId, text, interactionId, this, Thread.currentThread().getId()); } finally { Binder.restoreCallingIdentity(identityToken); if (success) { } if (packageNames != null) { List<AccessibilityNodeInfo> infos = getFindAccessibilityNodeInfosResultAndClear( interactionId); if (infos != null) { finalizeAndCacheAccessibilityNodeInfos(infos, connectionId); finalizeAndCacheAccessibilityNodeInfos(infos, connectionId, false, packageNames); return infos; } } Loading Loading @@ -426,14 +447,19 @@ public final class AccessibilityInteractionClient if (connection != null) { final int interactionId = mInteractionIdCounter.getAndIncrement(); final long identityToken = Binder.clearCallingIdentity(); final boolean success = connection.findFocus(accessibilityWindowId, final String[] packageNames; try { packageNames = connection.findFocus(accessibilityWindowId, accessibilityNodeId, focusType, interactionId, this, Thread.currentThread().getId()); } finally { Binder.restoreCallingIdentity(identityToken); if (success) { } if (packageNames != null) { AccessibilityNodeInfo info = getFindAccessibilityNodeInfoResultAndClear( interactionId); finalizeAndCacheAccessibilityNodeInfo(info, connectionId); finalizeAndCacheAccessibilityNodeInfo(info, connectionId, false, packageNames); return info; } } else { Loading Loading @@ -470,14 +496,19 @@ public final class AccessibilityInteractionClient if (connection != null) { final int interactionId = mInteractionIdCounter.getAndIncrement(); final long identityToken = Binder.clearCallingIdentity(); final boolean success = connection.focusSearch(accessibilityWindowId, final String[] packageNames; try { packageNames = connection.focusSearch(accessibilityWindowId, accessibilityNodeId, direction, interactionId, this, Thread.currentThread().getId()); } finally { Binder.restoreCallingIdentity(identityToken); if (success) { } if (packageNames != null) { AccessibilityNodeInfo info = getFindAccessibilityNodeInfoResultAndClear( interactionId); finalizeAndCacheAccessibilityNodeInfo(info, connectionId); finalizeAndCacheAccessibilityNodeInfo(info, connectionId, false, packageNames); return info; } } else { Loading Loading @@ -578,7 +609,7 @@ public final class AccessibilityInteractionClient int interactionId) { synchronized (mInstanceLock) { final boolean success = waitForResultTimedLocked(interactionId); List<AccessibilityNodeInfo> result = null; final List<AccessibilityNodeInfo> result; if (success) { result = mFindAccessibilityNodeInfosResult; } else { Loading Loading @@ -694,29 +725,45 @@ public final class AccessibilityInteractionClient * * @param info The info. * @param connectionId The id of the connection to the system. * @param bypassCache Whether or not to bypass the cache. The node is added to the cache if * this value is {@code false} * @param packageNames The valid package names a node can come from. */ private void finalizeAndCacheAccessibilityNodeInfo(AccessibilityNodeInfo info, int connectionId) { int connectionId, boolean bypassCache, String[] packageNames) { if (info != null) { info.setConnectionId(connectionId); // Empty array means any package name is Okay if (!ArrayUtils.isEmpty(packageNames) && !ArrayUtils.contains(packageNames, info.getPackageName().toString())) { // If the node package not one of the valid ones, pick the top one - this // is one of the packages running in the introspected UID. info.setPackageName(packageNames[0]); } info.setSealed(true); if (!bypassCache) { sAccessibilityCache.add(info); } } } /** * Finalize {@link AccessibilityNodeInfo}s before passing them to the client. * * @param infos The {@link AccessibilityNodeInfo}s. * @param connectionId The id of the connection to the system. * @param bypassCache Whether or not to bypass the cache. The nodes are added to the cache if * this value is {@code false} * @param packageNames The valid package names a node can come from. */ private void finalizeAndCacheAccessibilityNodeInfos(List<AccessibilityNodeInfo> infos, int connectionId) { int connectionId, boolean bypassCache, String[] packageNames) { if (infos != null) { final int infosCount = infos.size(); for (int i = 0; i < infosCount; i++) { AccessibilityNodeInfo info = infos.get(i); finalizeAndCacheAccessibilityNodeInfo(info, connectionId); finalizeAndCacheAccessibilityNodeInfo(info, connectionId, bypassCache, packageNames); } } } Loading