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

Commit f2cd6d23 authored by Sienna Liu's avatar Sienna Liu
Browse files

[MQ] Fix MQS local PictureProfile out of sync from DB issue.

* Do not cache local PictureProfile in MQS, but get the value from DB.
* Add lock to all access to `mOriginalToCurrent` and `mCurrentPictureHandleToOriginal`

Flag: EXEMPT bug fix
Bug: 427663034
Change-Id: I09891c9547dc9cf1cf406d907761719324a1f652
parent 3f13a29b
Loading
Loading
Loading
Loading
+29 −17
Original line number Diff line number Diff line
@@ -144,7 +144,7 @@ public class MediaQualityService extends SystemService {
    // A global lock for ambient backlight objects.
    private final Object mAmbientBacklightLock = new Object();

    private final Map<Long, PictureProfile> mHandleToPictureProfile = new HashMap<>();
    private final Map<Long, Long> mOriginalToCurrent = new HashMap<>();
    private final BiMap<Long, Long> mCurrentPictureHandleToOriginal = new BiMap<>();
    private final Set<Long> mPictureProfileForHal = new HashSet<>();

@@ -542,14 +542,16 @@ public class MediaQualityService extends SystemService {
                    -1
            );
            if (defaultPictureProfileId != -1) {
                synchronized (mPictureProfileLock) {
                    PictureProfile currentDefaultPictureProfile =
                        mHandleToPictureProfile.get(defaultPictureProfileId);
                            getCurrentPictureProfile(defaultPictureProfileId);
                    if (currentDefaultPictureProfile != null) {
                        return currentDefaultPictureProfile;
                    } else {
                        return mMqDatabaseUtils.getPictureProfile(defaultPictureProfileId, true);
                    }
                }
            }
            return null;
        }

@@ -725,7 +727,7 @@ public class MediaQualityService extends SystemService {
                    PictureProfile p = MediaQualityUtils.convertCursorToPictureProfileWithTempId(
                            cursor, mPictureProfileTempIdMap);
                    handle = p.getHandle().getId();
                    PictureProfile current = mHandleToPictureProfile.get(handle);
                    PictureProfile current = getCurrentPictureProfile(handle);
                    if (current != null) {
                        long currentHandle = current.getHandle().getId();
                        mHalNotifier.notifyHalOnPictureProfileChange(
@@ -1940,11 +1942,13 @@ public class MediaQualityService extends SystemService {
            if (mPpChangedListener != null) {
                try {
                    Long idForHal = dbId;
                    synchronized (mPictureProfileLock) {
                        Long originalHandle = mCurrentPictureHandleToOriginal.getValue(dbId);
                        if (originalHandle != null) {
                            // the original id is used in HAL because of status change
                            idForHal = originalHandle;
                        }
                    }
                    mPpChangedListener.onPictureProfileChanged(convertToHalPictureProfile(idForHal,
                            params));
                } catch (RemoteException e) {
@@ -2056,7 +2060,7 @@ public class MediaQualityService extends SystemService {
                    if (param.getTag() == PictureParameter.activeProfile
                            && !param.getActiveProfile()) {
                        synchronized (mPictureProfileLock) {
                            mHandleToPictureProfile.remove(dbId);
                            mOriginalToCurrent.remove(dbId);
                            mCurrentPictureHandleToOriginal.removeValue(dbId);
                        }
                        break;
@@ -2122,7 +2126,7 @@ public class MediaQualityService extends SystemService {
            mHandler.post(() -> {
                synchronized (mPictureProfileLock) {
                    // get from map if exists
                    PictureProfile previous = mHandleToPictureProfile.get(profileHandle);
                    PictureProfile previous = getCurrentPictureProfile(profileHandle);
                    if (previous == null) {
                        Slog.d(TAG, "Previous profile not in the map");
                        // get from DB if not exists
@@ -2192,7 +2196,7 @@ public class MediaQualityService extends SystemService {
                            // profile
                            PictureProfile currentCopy = PictureProfile.copyFrom(currentSdr);
                            currentCopy.addStringParameter(PREVIOUS_STREAM_STATUS, profileStatus);
                            mHandleToPictureProfile.put(profileHandle, currentSdr);
                            mOriginalToCurrent.put(profileHandle, currentSdr.getHandle().getId());
                            mCurrentPictureHandleToOriginal.removeValue(profileHandle);
                            mCurrentPictureHandleToOriginal.put(
                                    currentSdr.getHandle().getId(), profileHandle);
@@ -2218,7 +2222,7 @@ public class MediaQualityService extends SystemService {
                        // PREVIOUS_STREAM_STATUS is used for one time, so copy the current profile
                        PictureProfile currentCopy = PictureProfile.copyFrom(current);
                        currentCopy.addStringParameter(PREVIOUS_STREAM_STATUS, profileStatus);
                        mHandleToPictureProfile.put(profileHandle, current);
                        mOriginalToCurrent.put(profileHandle, current.getHandle().getId());
                        mCurrentPictureHandleToOriginal.removeValue(profileHandle);
                        mCurrentPictureHandleToOriginal.put(
                                current.getHandle().getId(), profileHandle);
@@ -2254,7 +2258,7 @@ public class MediaQualityService extends SystemService {
                        // PREVIOUS_STREAM_STATUS is used for one time, so copy the current profile
                        PictureProfile currentCopy = PictureProfile.copyFrom(current);
                        currentCopy.addStringParameter(PREVIOUS_STREAM_STATUS, profileStatus);
                        mHandleToPictureProfile.put(profileHandle, current);
                        mOriginalToCurrent.put(profileHandle, current.getHandle().getId());
                        mCurrentPictureHandleToOriginal.removeValue(profileHandle);
                        mCurrentPictureHandleToOriginal.put(
                                current.getHandle().getId(), profileHandle);
@@ -2655,4 +2659,12 @@ public class MediaQualityService extends SystemService {
        }
        return list.getFirst();
    }

    private PictureProfile getCurrentPictureProfile(Long originalHandle) {
        Long currentHandle = mOriginalToCurrent.get(originalHandle);
        if (currentHandle == null) {
            return null;
        }
        return mMqDatabaseUtils.getPictureProfile(currentHandle, /* includeParams= */ true);
    }
}