From 89e2ee9bc7f5c6ce012d815b93082dc6d8038840 Mon Sep 17 00:00:00 2001 From: Kyunglyul Hyun Date: Fri, 10 Apr 2020 20:17:04 +0900 Subject: [PATCH] MediaRouter: don't scanPackages if unnecessary scanPackages was called whenever it receives a broadcast, which could be duplicated. This CL adds a boolean variable (mScanPackagesScheduled) not to scan packages if it is scheduled. Bug: 153527463 Test: cts test, atest mediarouertest and check MediaRouteProvider#onBind, #onUnbind are called when a new provider is installed. Confirm # of calls is reduced (3 -> 1). Change-Id: Iaa423b7d1b2b2a97aebed0001b4077bdf95b1d54 --- .../MediaRoute2ProviderServiceProxy.java | 2 ++ .../media/MediaRoute2ProviderWatcher.java | 19 +++++++++---------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/services/core/java/com/android/server/media/MediaRoute2ProviderServiceProxy.java b/services/core/java/com/android/server/media/MediaRoute2ProviderServiceProxy.java index 2aa53cc3882e9..a5de90c93aab4 100644 --- a/services/core/java/com/android/server/media/MediaRoute2ProviderServiceProxy.java +++ b/services/core/java/com/android/server/media/MediaRoute2ProviderServiceProxy.java @@ -169,6 +169,8 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider } public void rebindIfDisconnected() { + //TODO: When we are connecting to the service, calling this will unbind and bind again. + // We'd better not unbind if we are connecting. if (mActiveConnection == null && shouldBind()) { unbind(); bind(); diff --git a/services/core/java/com/android/server/media/MediaRoute2ProviderWatcher.java b/services/core/java/com/android/server/media/MediaRoute2ProviderWatcher.java index fe118e51cdcee..b688e0922d49c 100644 --- a/services/core/java/com/android/server/media/MediaRoute2ProviderWatcher.java +++ b/services/core/java/com/android/server/media/MediaRoute2ProviderWatcher.java @@ -83,7 +83,7 @@ final class MediaRoute2ProviderWatcher { // Scan packages. // Also has the side-effect of restarting providers if needed. - mHandler.post(mScanPackagesRunnable); + postScanPackagesIfNeeded(); } } @@ -92,7 +92,7 @@ final class MediaRoute2ProviderWatcher { mRunning = false; mContext.unregisterReceiver(mScanPackagesReceiver); - mHandler.removeCallbacks(mScanPackagesRunnable); + mHandler.removeCallbacks(this::scanPackages); // Stop all providers. for (int i = mProxies.size() - 1; i >= 0; i--) { @@ -154,20 +154,19 @@ final class MediaRoute2ProviderWatcher { return -1; } + private void postScanPackagesIfNeeded() { + if (!mHandler.hasCallbacks(this::scanPackages)) { + mHandler.post(this::scanPackages); + } + } + private final BroadcastReceiver mScanPackagesReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (DEBUG) { Slog.d(TAG, "Received package manager broadcast: " + intent); } - scanPackages(); - } - }; - - private final Runnable mScanPackagesRunnable = new Runnable() { - @Override - public void run() { - scanPackages(); + postScanPackagesIfNeeded(); } };