Simplify system routing activity

This is a non-functional change removing unused code. Simplifies
following changes related to transfer initiation.

Bug: b/319645714
Test: Manually using the app.
Test: Presubmit.
Change-Id: Icb7a4c4916420303053e9fd53930f18e0005a73a
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRoutingActivity.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRoutingActivity.java
index 73d57fe..46e5a19 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRoutingActivity.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/SystemRoutingActivity.java
@@ -53,16 +53,9 @@
 
     private static final int REQUEST_CODE_BLUETOOTH_CONNECT = 4199;
 
-    @NonNull
-    private final SystemRoutesAdapter mSystemRoutesAdapter = new SystemRoutesAdapter();
-    @NonNull
-    private final List<SystemRoutesSource> mSystemRoutesSources = new ArrayList<>();
-    @NonNull
-    private final SystemRoutesSourceCallback mSystemRoutesSourceCallback =
-            new SystemRoutesSourceCallback();
-
-    @NonNull
-    private SwipeRefreshLayout mSwipeRefreshLayout;
+    @NonNull private final SystemRoutesAdapter mSystemRoutesAdapter = new SystemRoutesAdapter();
+    @NonNull private final List<SystemRoutesSource> mSystemRoutesSources = new ArrayList<>();
+    @NonNull private SwipeRefreshLayout mSwipeRefreshLayout;
 
     /**
      * Creates and launches an intent to start current activity.
@@ -170,20 +163,8 @@
         }
 
         for (SystemRoutesSource source: mSystemRoutesSources) {
-            source.setOnRoutesChangedListener(mSystemRoutesSourceCallback);
+            source.setOnRoutesChangedListener(this::refreshSystemRoutesList);
             source.start();
         }
     }
-
-    private class SystemRoutesSourceCallback implements SystemRoutesSource.OnRoutesChangedListener {
-        @Override
-        public void onRouteAdded(@NonNull SystemRouteItem routeItem) {
-            refreshSystemRoutesList();
-        }
-
-        @Override
-        public void onRouteRemoved(@NonNull SystemRouteItem routeItem) {
-            refreshSystemRoutesList();
-        }
-    }
 }
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/AndroidXMediaRouterSystemRoutesSource.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/AndroidXMediaRouterSystemRoutesSource.java
index 7e553ed..df83d49 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/AndroidXMediaRouterSystemRoutesSource.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/AndroidXMediaRouterSystemRoutesSource.java
@@ -36,19 +36,20 @@
     private final MediaRouter mMediaRouter;
 
     @NonNull
-    private final MediaRouter.Callback mMediaRouterCallback = new MediaRouter.Callback() {
-        @Override
-        public void onRouteAdded(@NonNull MediaRouter router,
-                @NonNull MediaRouter.RouteInfo route) {
-            mOnRoutesChangedListener.onRouteAdded(createRouteItemFor(route));
-        }
+    private final MediaRouter.Callback mMediaRouterCallback =
+            new MediaRouter.Callback() {
+                @Override
+                public void onRouteAdded(
+                        @NonNull MediaRouter router, @NonNull MediaRouter.RouteInfo route) {
+                    mOnRoutesChangedListener.run();
+                }
 
-        @Override
-        public void onRouteRemoved(@NonNull MediaRouter router,
-                @NonNull MediaRouter.RouteInfo route) {
-            mOnRoutesChangedListener.onRouteRemoved(createRouteItemFor(route));
-        }
-    };
+                @Override
+                public void onRouteRemoved(
+                        @NonNull MediaRouter router, @NonNull MediaRouter.RouteInfo route) {
+                    mOnRoutesChangedListener.run();
+                }
+            };
 
     /** Returns a new instance. */
     @NonNull
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/AudioManagerSystemRoutesSource.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/AudioManagerSystemRoutesSource.java
index 80d6e33..8888fb76 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/AudioManagerSystemRoutesSource.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/AudioManagerSystemRoutesSource.java
@@ -40,21 +40,18 @@
     private final AudioManager mAudioManager;
 
     @NonNull
-    private final AudioDeviceCallback mAudioDeviceCallback = new AudioDeviceCallback() {
-        @Override
-        public void onAudioDevicesAdded(AudioDeviceInfo[] addedDevices) {
-            for (AudioDeviceInfo audioDeviceInfo: addedDevices) {
-                mOnRoutesChangedListener.onRouteAdded(createRouteItemFor(audioDeviceInfo));
-            }
-        }
+    private final AudioDeviceCallback mAudioDeviceCallback =
+            new AudioDeviceCallback() {
+                @Override
+                public void onAudioDevicesAdded(AudioDeviceInfo[] addedDevices) {
+                    mOnRoutesChangedListener.run();
+                }
 
-        @Override
-        public void onAudioDevicesRemoved(AudioDeviceInfo[] removedDevices) {
-            for (AudioDeviceInfo audioDeviceInfo: removedDevices) {
-                mOnRoutesChangedListener.onRouteRemoved(createRouteItemFor(audioDeviceInfo));
-            }
-        }
-    };
+                @Override
+                public void onAudioDevicesRemoved(AudioDeviceInfo[] removedDevices) {
+                    mOnRoutesChangedListener.run();
+                }
+            };
 
     /** Returns a new instance. */
     @NonNull
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/BluetoothManagerSystemRoutesSource.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/BluetoothManagerSystemRoutesSource.java
index 96fab5b..a3b52b6 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/BluetoothManagerSystemRoutesSource.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/BluetoothManagerSystemRoutesSource.java
@@ -23,7 +23,6 @@
 import android.bluetooth.BluetoothHearingAid;
 import android.bluetooth.BluetoothLeAudio;
 import android.bluetooth.BluetoothManager;
-import android.bluetooth.BluetoothProfile;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -31,7 +30,6 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.RequiresPermission;
-import androidx.core.content.IntentCompat;
 
 import com.example.androidx.mediarouting.activities.systemrouting.SystemRouteItem;
 import com.example.androidx.mediarouting.activities.systemrouting.SystemRoutesSourceItem;
@@ -117,27 +115,14 @@
         @Override
         @RequiresPermission(Manifest.permission.BLUETOOTH_CONNECT)
         public void onReceive(Context context, Intent intent) {
-            BluetoothDevice device = IntentCompat.getParcelableExtra(intent,
-                    BluetoothDevice.EXTRA_DEVICE, android.bluetooth.BluetoothDevice.class);
-
             switch (intent.getAction()) {
                 case BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED:
                 case BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED:
                 case BluetoothLeAudio.ACTION_LE_AUDIO_CONNECTION_STATE_CHANGED:
-                    handleConnectionStateChanged(intent, device);
+                    mOnRoutesChangedListener.run();
                     break;
-            }
-        }
-
-        @RequiresPermission(Manifest.permission.BLUETOOTH_CONNECT)
-        private void handleConnectionStateChanged(Intent intent,
-                BluetoothDevice device) {
-            int state = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, -1);
-            if (state == BluetoothProfile.STATE_CONNECTED) {
-                mOnRoutesChangedListener.onRouteAdded(createRouteItemFor(device));
-            } else if (state == BluetoothProfile.STATE_DISCONNECTING
-                    || state == BluetoothProfile.STATE_DISCONNECTED) {
-                mOnRoutesChangedListener.onRouteRemoved(createRouteItemFor(device));
+                default:
+                    // Do nothing.
             }
         }
     }
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/MediaRouter2SystemRoutesSource.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/MediaRouter2SystemRoutesSource.java
index df60049..0395332 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/MediaRouter2SystemRoutesSource.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/MediaRouter2SystemRoutesSource.java
@@ -46,30 +46,30 @@
     @NonNull private final Method mSuitabilityStatusMethod;
     @NonNull
     private final Map<String, MediaRoute2Info> mLastKnownRoutes = new HashMap<>();
+
     @NonNull
-    private final MediaRouter2.RouteCallback mRouteCallback = new MediaRouter2.RouteCallback() {
-        @Override
-        public void onRoutesUpdated(@NonNull List<MediaRoute2Info> routes) {
-            super.onRoutesUpdated(routes);
+    private final MediaRouter2.RouteCallback mRouteCallback =
+            new MediaRouter2.RouteCallback() {
+                @Override
+                public void onRoutesUpdated(@NonNull List<MediaRoute2Info> routes) {
+                    Map<String, MediaRoute2Info> newRoutes = new HashMap<>();
+                    boolean routesChanged = false;
+                    for (MediaRoute2Info route : routes) {
+                        routesChanged |= !mLastKnownRoutes.containsKey(route.getId());
+                        newRoutes.put(route.getId(), route);
+                    }
 
-            Map<String, MediaRoute2Info> routesLookup = new HashMap<>();
-            for (MediaRoute2Info route: routes) {
-                if (!mLastKnownRoutes.containsKey(route.getId())) {
-                    mOnRoutesChangedListener.onRouteAdded(createRouteItemFor(route));
+                    for (MediaRoute2Info route : mLastKnownRoutes.values()) {
+                        routesChanged |= !newRoutes.containsKey(route.getId());
+                    }
+
+                    mLastKnownRoutes.clear();
+                    mLastKnownRoutes.putAll(newRoutes);
+                    if (routesChanged) {
+                        mOnRoutesChangedListener.run();
+                    }
                 }
-                routesLookup.put(route.getId(), route);
-            }
-
-            for (MediaRoute2Info route: mLastKnownRoutes.values()) {
-                if (!routesLookup.containsKey(route.getId())) {
-                    mOnRoutesChangedListener.onRouteRemoved(createRouteItemFor(route));
-                }
-            }
-
-            mLastKnownRoutes.clear();
-            mLastKnownRoutes.putAll(routesLookup);
-        }
-    };
+            };
 
     /** Returns a new instance. */
     @NonNull
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/MediaRouterSystemRoutesSource.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/MediaRouterSystemRoutesSource.java
index 438ccfc..26a5188 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/MediaRouterSystemRoutesSource.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/MediaRouterSystemRoutesSource.java
@@ -34,19 +34,19 @@
     private final MediaRouter mMediaRouter;
 
     @NonNull
-    private final MediaRouter.Callback mCallback = new MediaRouter.SimpleCallback() {
-        @Override
-        public void onRouteAdded(MediaRouter router, MediaRouter.RouteInfo info) {
-            super.onRouteAdded(router, info);
-            mOnRoutesChangedListener.onRouteAdded(createRouteItemFor(info));
-        }
+    private final MediaRouter.Callback mCallback =
+            new MediaRouter.SimpleCallback() {
+                @Override
+                public void onRouteAdded(MediaRouter router, MediaRouter.RouteInfo info) {
+                    mOnRoutesChangedListener.run();
+                }
 
-        @Override
-        public void onRouteRemoved(MediaRouter router, MediaRouter.RouteInfo info) {
-            super.onRouteRemoved(router, info);
-            mOnRoutesChangedListener.onRouteRemoved(createRouteItemFor(info));
-        }
-    };
+                @Override
+                public void onRouteRemoved(MediaRouter router, MediaRouter.RouteInfo info) {
+                    super.onRouteRemoved(router, info);
+                    mOnRoutesChangedListener.run();
+                }
+            };
 
     /** Returns a new instance. */
     @NonNull
diff --git a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/SystemRoutesSource.java b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/SystemRoutesSource.java
index f5a32db..a2a390f 100644
--- a/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/SystemRoutesSource.java
+++ b/samples/MediaRoutingDemo/src/main/java/com/example/androidx/mediarouting/activities/systemrouting/source/SystemRoutesSource.java
@@ -17,7 +17,6 @@
 package com.example.androidx.mediarouting.activities.systemrouting.source;
 
 import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 
 import com.example.androidx.mediarouting.activities.systemrouting.SystemRouteItem;
 import com.example.androidx.mediarouting.activities.systemrouting.SystemRoutesSourceItem;
@@ -29,23 +28,11 @@
  */
 public abstract class SystemRoutesSource {
 
-    private static final NoOpOnRoutesChangedListener NO_OP_ON_ROUTES_CHANGED_LISTENER =
-            new NoOpOnRoutesChangedListener();
+    @NonNull protected Runnable mOnRoutesChangedListener = () -> {};
 
-    @NonNull
-    protected OnRoutesChangedListener mOnRoutesChangedListener = NO_OP_ON_ROUTES_CHANGED_LISTENER;
-
-    /**
-     * Sets {@link OnRoutesChangedListener} and subscribes to the source updates.
-     * To unsubscribe from the routes update pass {@code null} instead of the listener.
-     */
-    public void setOnRoutesChangedListener(
-            @Nullable OnRoutesChangedListener onRoutesChangedListener) {
-        if (onRoutesChangedListener != null) {
-            mOnRoutesChangedListener = onRoutesChangedListener;
-        } else {
-            mOnRoutesChangedListener = NO_OP_ON_ROUTES_CHANGED_LISTENER;
-        }
+    /** Sets a {@link Runnable} to invoke whenever routes change. */
+    public void setOnRoutesChangedListener(@NonNull Runnable onRoutesChangedListener) {
+        mOnRoutesChangedListener = onRoutesChangedListener;
     }
 
     /**
@@ -74,41 +61,4 @@
      */
     @NonNull
     public abstract List<SystemRouteItem> fetchSourceRouteItems();
-
-    /**
-     * An interface for listening to routes changes: whether the route has been added or removed
-     * from the source.
-     */
-    public interface OnRoutesChangedListener {
-
-        /**
-         * Called when a route has been added to the source's routes list.
-         *
-         * @param routeItem a newly added route.
-         */
-        void onRouteAdded(@NonNull SystemRouteItem routeItem);
-
-        /**
-         * Called when a route has been removed from the source's routes list.
-         *
-         * @param routeItem a recently removed route.
-         */
-        void onRouteRemoved(@NonNull SystemRouteItem routeItem);
-    }
-
-    /**
-     * Default no-op implementation of {@link OnRoutesChangedListener}.
-     * Used as a fallback implement when there is no listener.
-     */
-    private static final class NoOpOnRoutesChangedListener implements OnRoutesChangedListener {
-        @Override
-        public void onRouteAdded(@NonNull SystemRouteItem routeItem) {
-            // Empty on purpose.
-        }
-
-        @Override
-        public void onRouteRemoved(@NonNull SystemRouteItem routeItem) {
-            // Empty on purpose.
-        }
-    }
 }