Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6d1794c7 authored by Derek Jedral's avatar Derek Jedral
Browse files

Fix null issues with suggestions codepaths

Update the system server implementation to never return a null map of
suggestions, to align with nullability design guidelines for APIs. Also
update InfoMediaManager to check if the previous suggestion is null
before checking route IDs.

Test: ateast
Bug: 393216590
Flag: com.android.media.flags.enable_suggested_device_api
Change-Id: Icf943387aea26a796a950f2e2882a90d1e415f95
parent 2d4cbbfd
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -75,7 +75,7 @@ interface IMediaRouterService {
    void releaseSessionWithRouter2(IMediaRouter2 router, String sessionId);
    void setDeviceSuggestionsWithRouter2(IMediaRouter2 router,
            in @nullable List<SuggestedDeviceInfo> suggestedDeviceInfo);
    @nullable Map<String, List<SuggestedDeviceInfo>> getDeviceSuggestionsWithRouter2(
    Map<String, List<SuggestedDeviceInfo>> getDeviceSuggestionsWithRouter2(
            IMediaRouter2 router);

    // Methods for MediaRouter2Manager
@@ -105,7 +105,7 @@ interface IMediaRouterService {
    boolean showMediaOutputSwitcherWithProxyRouter(IMediaRouter2Manager manager);
    void setDeviceSuggestionsWithManager(IMediaRouter2Manager manager,
            in @nullable List<SuggestedDeviceInfo> suggestedDeviceInfo);
    @nullable Map<String, List<SuggestedDeviceInfo>> getDeviceSuggestionsWithManager(
Map<String, List<SuggestedDeviceInfo>> getDeviceSuggestionsWithManager(
            IMediaRouter2Manager manager);
    void onDeviceSuggestionRequestedWithManager(IMediaRouter2Manager manager);
}
+4 −3
Original line number Diff line number Diff line
@@ -730,7 +730,8 @@ public abstract class InfoMediaManager {
                }
            }
            if (newSuggestedDeviceState == null) {
                if (topSuggestion
                if (previousState != null
                        && topSuggestion
                                .getRouteId()
                                .equals(previousState.getSuggestedDeviceInfo().getRouteId())) {
                    return;
+25 −0
Original line number Diff line number Diff line
@@ -997,6 +997,31 @@ public class InfoMediaManagerTest {
                .isEqualTo(suggestedDeviceInfo);
    }

    @EnableFlags(Flags.FLAG_ENABLE_SUGGESTED_DEVICE_API)
    @Test
    public void onSuggestionUpdated_routesNotSet_listenersNotified() {
        SuggestedDeviceInfo suggestedDeviceInfo =
                new SuggestedDeviceInfo.Builder()
                        .setDeviceDisplayName("device_name")
                        .setRouteId(TEST_ID_3)
                        .setType(0)
                        .build();
        RouterInfoMediaManager mediaManager = createRouterInfoMediaManager();
        mediaManager.registerCallback(mCallback);
        clearInvocations(mCallback);
        verify(mRouter2)
                .registerDeviceSuggestionsCallback(
                        any(), mDeviceSuggestionsCallbackCaptor.capture());

        mDeviceSuggestionsCallbackCaptor
                .getValue()
                .onSuggestionUpdated("random_package_name", List.of(suggestedDeviceInfo));

        verify(mCallback).onSuggestedDeviceUpdated(mSuggestedDeviceStateCaptor.capture());
        assertThat(mSuggestedDeviceStateCaptor.getValue().getSuggestedDeviceInfo())
                .isEqualTo(suggestedDeviceInfo);
    }

    @EnableFlags(Flags.FLAG_ENABLE_SUGGESTED_DEVICE_API)
    @Test
    public void onSuggestionUpdated_mediaDeviceIsSuggested() {
+7 −6
Original line number Diff line number Diff line
@@ -571,7 +571,7 @@ class MediaRouter2ServiceImpl {
        }
    }

    @Nullable
    @NonNull
    public Map<String, List<SuggestedDeviceInfo>> getDeviceSuggestionsWithRouter2(
            @NonNull IMediaRouter2 router) {
        Objects.requireNonNull(router, "router must not be null");
@@ -855,7 +855,7 @@ class MediaRouter2ServiceImpl {
        }
    }

    @Nullable
    @NonNull
    public Map<String, List<SuggestedDeviceInfo>> getDeviceSuggestionsWithManager(
            @NonNull IMediaRouter2Manager manager) {
        Objects.requireNonNull(manager, "manager must not be null");
@@ -1693,7 +1693,7 @@ class MediaRouter2ServiceImpl {
    }

    @GuardedBy("mLock")
    @Nullable
    @NonNull
    private Map<String, List<SuggestedDeviceInfo>> getDeviceSuggestionsWithRouter2Locked(
            @NonNull IMediaRouter2 router) {
        final IBinder binder = router.asBinder();
@@ -2143,7 +2143,7 @@ class MediaRouter2ServiceImpl {
    }

    @GuardedBy("mLock")
    @Nullable
    @NonNull
    private Map<String, List<SuggestedDeviceInfo>> getDeviceSuggestionsWithManagerLocked(
            @NonNull IMediaRouter2Manager manager) {
        final IBinder binder = manager.asBinder();
@@ -2316,10 +2316,11 @@ class MediaRouter2ServiceImpl {
        }

        // @GuardedBy("mLock")
        @Nullable
        @NonNull
        public Map<String, List<SuggestedDeviceInfo>> getDeviceSuggestionsLocked(
                String packageName) {
            return mDeviceSuggestions.get(packageName);
            return mDeviceSuggestions.getOrDefault(
                    packageName, new HashMap<String, List<SuggestedDeviceInfo>>());
        }

        public void dump(@NonNull PrintWriter pw, @NonNull String prefix) {
+2 −2
Original line number Diff line number Diff line
@@ -535,7 +535,7 @@ public final class MediaRouterService extends IMediaRouterService.Stub

    // Binder call
    @Override
    @Nullable
    @NonNull
    public Map<String, List<SuggestedDeviceInfo>> getDeviceSuggestionsWithRouter2(
            IMediaRouter2 router) {
        return mService2.getDeviceSuggestionsWithRouter2(router);
@@ -693,7 +693,7 @@ public final class MediaRouterService extends IMediaRouterService.Stub

    // Binder call
    @Override
    @Nullable
    @NonNull
    public Map<String, List<SuggestedDeviceInfo>> getDeviceSuggestionsWithManager(
            IMediaRouter2Manager manager) {
        return mService2.getDeviceSuggestionsWithManager(manager);