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

Commit 173116ef authored by Nikolas Havrikov's avatar Nikolas Havrikov
Browse files

Make AssociationInfo immutable

This CL turns AssociationInfo into an immutable data class and
introduces a typesafe builder pattern for producing modified copies.

Note that this change now also invalidates the user cache entry when
making updates to associations.

Test: atest CtsCompanionDeviceManagerCoreTestCases
Test: atest CtsCompanionDeviceManagerUiAutomationTestCases
Change-Id: Ifd62d2ecce57790b6e462eb23033ca6c9a0cfe1b
parent 1774563e
Loading
Loading
Loading
Loading
+110 −18
Original line number Diff line number Diff line
@@ -54,13 +54,13 @@ public final class AssociationInfo implements Parcelable {
    private final @Nullable String mDeviceProfile;

    private final boolean mSelfManaged;
    private boolean mNotifyOnDeviceNearby;
    private final boolean mNotifyOnDeviceNearby;
    private final long mTimeApprovedMs;
    /**
     * A long value indicates the last time connected reported by selfManaged devices
     * Default value is Long.MAX_VALUE.
     */
    private long mLastTimeConnectedMs;
    private final long mLastTimeConnectedMs;

    /**
     * Creates a new Association.
@@ -160,22 +160,6 @@ public final class AssociationInfo implements Parcelable {
        return mSelfManaged;
    }

    /**
     * Should only be used by the CompanionDeviceManagerService.
     * @hide
     */
    public void setNotifyOnDeviceNearby(boolean notifyOnDeviceNearby) {
        mNotifyOnDeviceNearby = notifyOnDeviceNearby;
    }

    /**
     * Should only be used by the CompanionDeviceManagerService.
     * @hide
     */
    public void setLastTimeConnected(long lastTimeConnectedMs) {
        mLastTimeConnectedMs = lastTimeConnectedMs;
    }

    /** @hide */
    public boolean isNotifyOnDeviceNearby() {
        return mNotifyOnDeviceNearby;
@@ -330,4 +314,112 @@ public final class AssociationInfo implements Parcelable {
            return new AssociationInfo(in);
        }
    };

    /**
     * Use this method to obtain a builder that you can use to create a copy of the
     * given {@link AssociationInfo} with modified values of {@code mLastTimeConnected}
     * or {@code mNotifyOnDeviceNearby}.
     * <p>
     *     Note that you <b>must</b> call either {@link Builder#setLastTimeConnected(long)
     *     setLastTimeConnected} or {@link Builder#setNotifyOnDeviceNearby(boolean)
     *     setNotifyOnDeviceNearby} before you will be able to call {@link Builder#build() build}.
     *
     *     This is ensured statically at compile time.
     *
     * @hide
     */
    @NonNull
    public static NonActionableBuilder builder(@NonNull AssociationInfo info) {
        return new Builder(info);
    }

    /**
     * @hide
     */
    public static final class Builder implements NonActionableBuilder {
        @NonNull
        private final AssociationInfo mOriginalInfo;
        private boolean mNotifyOnDeviceNearby;
        private long mLastTimeConnectedMs;

        private Builder(@NonNull AssociationInfo info) {
            mOriginalInfo = info;
            mNotifyOnDeviceNearby = info.mNotifyOnDeviceNearby;
            mLastTimeConnectedMs = info.mLastTimeConnectedMs;
        }

        /**
         * Should only be used by the CompanionDeviceManagerService.
         * @hide
         */
        @Override
        @NonNull
        public Builder setLastTimeConnected(long lastTimeConnectedMs) {
            if (lastTimeConnectedMs < 0) {
                throw new IllegalArgumentException(
                        "lastTimeConnectedMs must not be negative! (Given " + lastTimeConnectedMs
                                + " )");
            }
            mLastTimeConnectedMs = lastTimeConnectedMs;
            return this;
        }

        /**
         * Should only be used by the CompanionDeviceManagerService.
         * @hide
         */
        @Override
        @NonNull
        public Builder setNotifyOnDeviceNearby(boolean notifyOnDeviceNearby) {
            mNotifyOnDeviceNearby = notifyOnDeviceNearby;
            return this;
        }

        /**
         * @hide
         */
        @NonNull
        public AssociationInfo build() {
            return new AssociationInfo(
                    mOriginalInfo.mId,
                    mOriginalInfo.mUserId,
                    mOriginalInfo.mPackageName,
                    mOriginalInfo.mDeviceMacAddress,
                    mOriginalInfo.mDisplayName,
                    mOriginalInfo.mDeviceProfile,
                    mOriginalInfo.mSelfManaged,
                    mNotifyOnDeviceNearby,
                    mOriginalInfo.mTimeApprovedMs,
                    mLastTimeConnectedMs
            );
        }
    }

    /**
     * This interface is returned from the
     * {@link AssociationInfo#builder(android.companion.AssociationInfo) builder} entry point
     * to indicate that this builder is not yet in a state that can produce a meaningful
     * {@link AssociationInfo} object that is different from the one originally passed in.
     *
     * <p>
     * Only by calling one of the setter methods is this builder turned into one where calling
     * {@link Builder#build() build()} makes sense.
     *
     * @hide
     */
    public interface NonActionableBuilder {
        /**
         * Should only be used by the CompanionDeviceManagerService.
         * @hide
         */
        @NonNull
        Builder setNotifyOnDeviceNearby(boolean notifyOnDeviceNearby);

        /**
         * Should only be used by the CompanionDeviceManagerService.
         * @hide
         */
        @NonNull
        Builder setLastTimeConnected(long lastTimeConnectedMs);
    }
}
+2 −0
Original line number Diff line number Diff line
@@ -136,6 +136,8 @@ class AssociationStoreImpl implements AssociationStore {

            // Update the ID-to-Association map.
            mIdMap.put(id, updated);
            // Invalidate the corresponding user cache entry.
            invalidateCacheForUserLocked(current.getUserId());

            // Update the MacAddress-to-List<Association> map if needed.
            final MacAddress updatedAddress = updated.getDeviceMacAddress();
+9 −5
Original line number Diff line number Diff line
@@ -600,11 +600,13 @@ public class CompanionDeviceManagerService extends SystemService
                return;
            }

            association.setLastTimeConnected(System.currentTimeMillis());
            mAssociationStore.updateAssociation(association);
            AssociationInfo updatedAssociationInfo = AssociationInfo.builder(association)
                    .setLastTimeConnected(System.currentTimeMillis())
                    .build();
            mAssociationStore.updateAssociation(updatedAssociationInfo);

            mCompanionDevicePresenceController.onDeviceNotifyAppeared(
                    association, getContext(), mMainHandler);
                    updatedAssociationInfo, getContext(), mMainHandler);
        }

        @Override
@@ -651,8 +653,10 @@ public class CompanionDeviceManagerService extends SystemService
                        + " for user " + userId));
            }

            association.setNotifyOnDeviceNearby(active);
            mAssociationStore.updateAssociation(association);
            AssociationInfo updatedAssociationInfo = AssociationInfo.builder(association)
                    .setNotifyOnDeviceNearby(active)
                    .build();
            mAssociationStore.updateAssociation(updatedAssociationInfo);
        }

        @Override