Fix appops callback leak

Test: dumpsys appops after track finish to verify listener clears
Bug: 376481063
Bug: 385535422
Flag: com.android.media.audio.hardening_impl
Change-Id: Id431726a669a31a65ff63a66c79aadd9c7701db8
diff --git a/media/libaudiopermission/AppOpsSession.cpp b/media/libaudiopermission/AppOpsSession.cpp
index 920a046..2461564 100644
--- a/media/libaudiopermission/AppOpsSession.cpp
+++ b/media/libaudiopermission/AppOpsSession.cpp
@@ -24,8 +24,10 @@
 
 namespace android::media::permission {
 
-// params are unreliable at the moment
-void DefaultAppOpsFacade::OpMonitor::opChanged(int32_t, const String16&) {
+// Package name param is unreliable (can be empty), but we should only get valid events based on
+// how we register the listener.
+void DefaultAppOpsFacade::OpMonitor::opChanged(int32_t op, const String16&) {
+    if (mOps.attributedOp != op && mOps.additionalOp != op) return;
     DefaultAppOpsFacade x{};
     const auto allowed = x.checkAccess(mAttr, mOps);
     std::lock_guard l_{mLock};
@@ -107,6 +109,9 @@
     }
     LOG_ALWAYS_FATAL_IF(monitor == nullptr, "Unexpected nullptr in cb map");
     monitor->stopListening();
+    // Callbacks are stored via binder identity in AppOpsService, so unregistering the callback
+    // removes it regardless of how many calls to startWatchingMode occurred
+    AppOpsManager{}.stopWatchingMode(monitor);
 }
 
 }  // namespace android::media::permission