diff options
| -rw-r--r-- | core/java/android/app/AppOpsManager.java | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index 7a545f695aff..565f69090c6b 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -9469,23 +9469,23 @@ public class AppOpsManager { e.rethrowFromSystemServer(); } - if (missedAsyncOps != null) { + // Copy pointer so callback can be dispatched out of lock + OnOpNotedCallback onOpNotedCallback = sOnOpNotedCallback; + if (onOpNotedCallback != null && missedAsyncOps != null) { int numMissedAsyncOps = missedAsyncOps.size(); for (int i = 0; i < numMissedAsyncOps; i++) { final AsyncNotedAppOp asyncNotedAppOp = missedAsyncOps.get(i); - if (sOnOpNotedCallback != null) { - sOnOpNotedCallback.getAsyncNotedExecutor().execute( - () -> sOnOpNotedCallback.onAsyncNoted(asyncNotedAppOp)); - } + onOpNotedCallback.getAsyncNotedExecutor().execute( + () -> onOpNotedCallback.onAsyncNoted(asyncNotedAppOp)); } } synchronized (this) { int numMissedSyncOps = sUnforwardedOps.size(); - for (int i = 0; i < numMissedSyncOps; i++) { - final AsyncNotedAppOp syncNotedAppOp = sUnforwardedOps.get(i); - if (sOnOpNotedCallback != null) { - sOnOpNotedCallback.getAsyncNotedExecutor().execute( - () -> sOnOpNotedCallback.onAsyncNoted(syncNotedAppOp)); + if (onOpNotedCallback != null) { + for (int i = 0; i < numMissedSyncOps; i++) { + final AsyncNotedAppOp syncNotedAppOp = sUnforwardedOps.get(i); + onOpNotedCallback.getAsyncNotedExecutor().execute( + () -> onOpNotedCallback.onAsyncNoted(syncNotedAppOp)); } } sUnforwardedOps.clear(); |