diff options
5 files changed, 26 insertions, 79 deletions
diff --git a/core/api/system-current.txt b/core/api/system-current.txt index c4b16ec06cc7..1e181c1169c0 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -10068,10 +10068,10 @@ package android.service.storage { public abstract class ExternalStorageService extends android.app.Service { ctor public ExternalStorageService(); + method public void onAnrDelayStarted(@NonNull String, int, int, int); method @NonNull public final android.os.IBinder onBind(@NonNull android.content.Intent); method public abstract void onEndSession(@NonNull String) throws java.io.IOException; method public void onFreeCache(@NonNull java.util.UUID, long) throws java.io.IOException; - method public long onGetAnrDelayMillis(@NonNull String, int); method public abstract void onStartSession(@NonNull String, int, @NonNull android.os.ParcelFileDescriptor, @NonNull java.io.File, @NonNull java.io.File) throws java.io.IOException; method public abstract void onVolumeStateChanged(@NonNull android.os.storage.StorageVolume) throws java.io.IOException; field public static final int FLAG_SESSION_ATTRIBUTE_INDEXABLE = 2; // 0x2 diff --git a/core/java/android/service/storage/ExternalStorageService.java b/core/java/android/service/storage/ExternalStorageService.java index 87add57f383d..1e07a8748af9 100644 --- a/core/java/android/service/storage/ExternalStorageService.java +++ b/core/java/android/service/storage/ExternalStorageService.java @@ -102,14 +102,6 @@ public abstract class ExternalStorageService extends Service { */ public static final String EXTRA_PACKAGE_NAME = "android.service.storage.extra.package_name"; - /** - * {@link Bundle} key for a {@link Long} value. - * - * {@hide} - */ - public static final String EXTRA_ANR_TIMEOUT_MS = - "android.service.storage.extra.anr_timeout_ms"; - /** @hide */ @IntDef(flag = true, prefix = {"FLAG_SESSION_"}, value = {FLAG_SESSION_TYPE_FUSE, FLAG_SESSION_ATTRIBUTE_INDEXABLE}) @@ -178,12 +170,12 @@ public abstract class ExternalStorageService extends Service { } /** - * Called when {@code packageName} is about to ANR + * Called when {@code packageName} is about to ANR. The {@link ExternalStorageService} can + * show a progress dialog for the {@code reason}. * - * @return ANR dialog delay in milliseconds */ - public long onGetAnrDelayMillis(@NonNull String packageName, int uid) { - throw new UnsupportedOperationException("onGetAnrDelayMillis not implemented"); + public void onAnrDelayStarted(@NonNull String packageName, int uid, int tid, int reason) { + throw new UnsupportedOperationException("onAnrDelayStarted not implemented"); } @Override @@ -247,14 +239,14 @@ public abstract class ExternalStorageService extends Service { } @Override - public void getAnrDelayMillis(String packageName, int uid, RemoteCallback callback) - throws RemoteException { + public void notifyAnrDelayStarted(String packageName, int uid, int tid, int reason, + RemoteCallback callback) throws RemoteException { mHandler.post(() -> { try { - long timeoutMs = onGetAnrDelayMillis(packageName, uid); - sendTimeoutResult(packageName, timeoutMs, null /* throwable */, callback); + onAnrDelayStarted(packageName, uid, tid, reason); + sendResult(packageName, null /* throwable */, callback); } catch (Throwable t) { - sendTimeoutResult(packageName, 0 /* timeoutMs */, t, callback); + sendResult(packageName, t, callback); } }); } @@ -267,16 +259,5 @@ public abstract class ExternalStorageService extends Service { } callback.sendResult(bundle); } - - private void sendTimeoutResult(String packageName, long timeoutMs, Throwable throwable, - RemoteCallback callback) { - Bundle bundle = new Bundle(); - bundle.putString(EXTRA_PACKAGE_NAME, packageName); - bundle.putLong(EXTRA_ANR_TIMEOUT_MS, timeoutMs); - if (throwable != null) { - bundle.putParcelable(EXTRA_ERROR, new ParcelableException(throwable)); - } - callback.sendResult(bundle); - } } } diff --git a/core/java/android/service/storage/IExternalStorageService.aidl b/core/java/android/service/storage/IExternalStorageService.aidl index 2e0bd86c3d7d..ba98efa58f7c 100644 --- a/core/java/android/service/storage/IExternalStorageService.aidl +++ b/core/java/android/service/storage/IExternalStorageService.aidl @@ -32,5 +32,6 @@ oneway interface IExternalStorageService in RemoteCallback callback); void freeCache(@utf8InCpp String sessionId, in String volumeUuid, long bytes, in RemoteCallback callback); - void getAnrDelayMillis(String packageName, int uid, in RemoteCallback callback); + void notifyAnrDelayStarted(String packageName, int uid, int tid, int reason, + in RemoteCallback callback); }
\ No newline at end of file diff --git a/services/core/java/com/android/server/storage/StorageSessionController.java b/services/core/java/com/android/server/storage/StorageSessionController.java index 0087c0c29853..1d83d74194b6 100644 --- a/services/core/java/com/android/server/storage/StorageSessionController.java +++ b/services/core/java/com/android/server/storage/StorageSessionController.java @@ -162,22 +162,17 @@ public final class StorageSessionController { * * @return ANR dialog delay in milliseconds */ - public long getAnrDelayMillis(String packageName, int uid) + public void notifyAnrDelayStarted(String packageName, int uid, int tid, int reason) throws ExternalStorageServiceException { + final int userId = UserHandle.getUserId(uid); + final StorageUserConnection connection; synchronized (mLock) { - int size = mConnections.size(); - for (int i = 0; i < size; i++) { - int key = mConnections.keyAt(i); - StorageUserConnection connection = mConnections.get(key); - if (connection != null) { - long delay = connection.getAnrDelayMillis(packageName, uid); - if (delay > 0) { - return delay; - } - } - } + connection = mConnections.get(userId); + } + + if (connection != null) { + connection.notifyAnrDelayStarted(packageName, uid, tid, reason); } - return 0; } /** diff --git a/services/core/java/com/android/server/storage/StorageUserConnection.java b/services/core/java/com/android/server/storage/StorageUserConnection.java index 709d558ea0bc..9e6e301f7b14 100644 --- a/services/core/java/com/android/server/storage/StorageUserConnection.java +++ b/services/core/java/com/android/server/storage/StorageUserConnection.java @@ -16,7 +16,6 @@ package com.android.server.storage; -import static android.service.storage.ExternalStorageService.EXTRA_ANR_TIMEOUT_MS; import static android.service.storage.ExternalStorageService.EXTRA_ERROR; import static android.service.storage.ExternalStorageService.FLAG_SESSION_ATTRIBUTE_INDEXABLE; import static android.service.storage.ExternalStorageService.FLAG_SESSION_TYPE_FUSE; @@ -148,17 +147,13 @@ public final class StorageUserConnection { * * @return ANR dialog delay in milliseconds */ - public long getAnrDelayMillis(String packageName, int uid) + public void notifyAnrDelayStarted(String packageName, int uid, int tid, int reason) throws ExternalStorageServiceException { synchronized (mSessionsLock) { for (String sessionId : mSessions.keySet()) { - long delay = mActiveConnection.getAnrDelayMillis(packageName, uid); - if (delay > 0) { - return delay; - } + mActiveConnection.notifyAnrDelayStarted(packageName, uid, tid, reason); } } - return 0; } /** @@ -253,9 +248,6 @@ public final class StorageUserConnection { @GuardedBy("mLock") private final ArrayList<CompletableFuture<Void>> mOutstandingOps = new ArrayList<>(); - @GuardedBy("mLock") - private final ArrayList<CompletableFuture<Long>> mOutstandingTimeoutOps = new ArrayList<>(); - @Override public void close() { ServiceConnection oldConnection = null; @@ -272,9 +264,6 @@ public final class StorageUserConnection { for (CompletableFuture<Void> op : mOutstandingOps) { op.cancel(true); } - for (CompletableFuture<Long> op : mOutstandingTimeoutOps) { - op.cancel(true); - } mOutstandingOps.clear(); } @@ -297,15 +286,6 @@ public final class StorageUserConnection { DEFAULT_REMOTE_TIMEOUT_SECONDS); } - private long waitForAsyncLong(AsyncStorageServiceCall asyncCall) throws Exception { - CompletableFuture<Long> opFuture = new CompletableFuture<>(); - RemoteCallback callback = - new RemoteCallback(result -> setTimeoutResult(result, opFuture)); - - return waitForAsync(asyncCall, callback, opFuture, mOutstandingTimeoutOps, - 1 /* timeoutSeconds */); - } - private <T> T waitForAsync(AsyncStorageServiceCall asyncCall, RemoteCallback callback, CompletableFuture<T> opFuture, ArrayList<CompletableFuture<T>> outstandingOps, long timeoutSeconds) throws Exception { @@ -380,27 +360,17 @@ public final class StorageUserConnection { } } - public long getAnrDelayMillis(String packgeName, int uid) + public void notifyAnrDelayStarted(String packgeName, int uid, int tid, int reason) throws ExternalStorageServiceException { try { - return waitForAsyncLong((service, callback) -> - service.getAnrDelayMillis(packgeName, uid, callback)); + waitForAsyncVoid((service, callback) -> + service.notifyAnrDelayStarted(packgeName, uid, tid, reason, callback)); } catch (Exception e) { - throw new ExternalStorageServiceException("Failed to notify app not responding: " + throw new ExternalStorageServiceException("Failed to notify ANR delay started: " + packgeName, e); } } - private void setTimeoutResult(Bundle result, CompletableFuture<Long> future) { - ParcelableException ex = result.getParcelable(EXTRA_ERROR); - if (ex != null) { - future.completeExceptionally(ex); - } else { - long timeoutMs = result.getLong(EXTRA_ANR_TIMEOUT_MS); - future.complete(timeoutMs); - } - } - private void setResult(Bundle result, CompletableFuture<Void> future) { ParcelableException ex = result.getParcelable(EXTRA_ERROR); if (ex != null) { |