147a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun/*
247a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun * Copyright (C) 2018 The Android Open Source Project
347a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun *
447a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun * Licensed under the Apache License, Version 2.0 (the "License");
547a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun * you may not use this file except in compliance with the License.
647a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun * You may obtain a copy of the License at
747a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun *
847a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun *      http://www.apache.org/licenses/LICENSE-2.0
947a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun *
1047a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun * Unless required by applicable law or agreed to in writing, software
1147a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun * distributed under the License is distributed on an "AS IS" BASIS,
1247a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1347a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun * See the License for the specific language governing permissions and
1447a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun * limitations under the License.
1547a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun */
1647a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sunpackage android.telephony.euicc;
1747a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun
1847a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sunimport android.annotation.IntDef;
1947a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sunimport android.annotation.Nullable;
204f73b9c09ac6ae73c22ad02872e362c817ab2d4cHolly Jiuyu Sunimport android.annotation.SystemApi;
2147a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sunimport android.os.Parcel;
2247a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sunimport android.os.Parcelable;
2347a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun
2447a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sunimport java.lang.annotation.Retention;
2547a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sunimport java.lang.annotation.RetentionPolicy;
2647a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sunimport java.util.Arrays;
2747a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sunimport java.util.Objects;
2847a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun
2947a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun/**
3047a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun * This represents a signed notification which is defined in SGP.22. It can be either a profile
3147a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun * installation result or a notification generated for profile operations (e.g., enabling,
3247a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun * disabling, or deleting).
3347a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun *
3447a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun * @hide
3547a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun */
364f73b9c09ac6ae73c22ad02872e362c817ab2d4cHolly Jiuyu Sun@SystemApi
374f73b9c09ac6ae73c22ad02872e362c817ab2d4cHolly Jiuyu Sunpublic final class EuiccNotification implements Parcelable {
3847a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    /** Event */
3947a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    @Retention(RetentionPolicy.SOURCE)
4047a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    @IntDef(flag = true, prefix = { "EVENT_" }, value = {
4147a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun            EVENT_INSTALL,
4247a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun            EVENT_ENABLE,
4347a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun            EVENT_DISABLE,
4447a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun            EVENT_DELETE
4547a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    })
464f73b9c09ac6ae73c22ad02872e362c817ab2d4cHolly Jiuyu Sun    /** @hide */
4747a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    public @interface Event {}
4847a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun
4947a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    /** A profile is downloaded and installed. */
5047a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    public static final int EVENT_INSTALL = 1;
5147a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun
5247a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    /** A profile is enabled. */
5347a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    public static final int EVENT_ENABLE = 1 << 1;
5447a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun
5547a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    /** A profile is disabled. */
5647a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    public static final int EVENT_DISABLE = 1 << 2;
5747a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun
5847a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    /** A profile is deleted. */
5947a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    public static final int EVENT_DELETE = 1 << 3;
6047a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun
614f73b9c09ac6ae73c22ad02872e362c817ab2d4cHolly Jiuyu Sun    /** Value of the bits of all the events including install, enable, disable and delete. */
6247a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    @Event
6347a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    public static final int ALL_EVENTS =
6447a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun            EVENT_INSTALL | EVENT_ENABLE | EVENT_DISABLE | EVENT_DELETE;
6547a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun
6647a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    private final int mSeq;
6747a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    private final String mTargetAddr;
6847a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    @Event private final int mEvent;
6947a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    @Nullable private final byte[] mData;
7047a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun
7147a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    /**
7247a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun     * Creates an instance.
7347a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun     *
7447a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun     * @param seq The sequence number of this notification.
7547a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun     * @param targetAddr The target server where to send this notification.
7647a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun     * @param event The event which causes this notification.
7747a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun     * @param data The data which needs to be sent to the target server. This can be null for
7847a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun     *     building a list of notification metadata without data.
7947a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun     */
8047a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    public EuiccNotification(int seq, String targetAddr, @Event int event, @Nullable byte[] data) {
8147a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun        mSeq = seq;
8247a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun        mTargetAddr = targetAddr;
8347a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun        mEvent = event;
8447a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun        mData = data;
8547a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    }
8647a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun
8747a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    /** @return The sequence number of this notification. */
8847a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    public int getSeq() {
8947a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun        return mSeq;
9047a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    }
9147a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun
9247a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    /** @return The target server address where this notification should be sent to. */
9347a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    public String getTargetAddr() {
9447a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun        return mTargetAddr;
9547a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    }
9647a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun
9747a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    /** @return The event of this notification. */
9847a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    @Event
9947a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    public int getEvent() {
10047a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun        return mEvent;
10147a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    }
10247a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun
10347a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    /** @return The notification data which needs to be sent to the target server. */
10447a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    @Nullable
10547a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    public byte[] getData() {
10647a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun        return mData;
10747a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    }
10847a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun
10947a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    @Override
11047a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    public boolean equals(Object obj) {
11147a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun        if (this == obj) {
11247a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun            return true;
11347a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun        }
11447a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun        if (obj == null || getClass() != obj.getClass()) {
11547a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun            return false;
11647a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun        }
11747a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun
11847a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun        EuiccNotification that = (EuiccNotification) obj;
11947a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun        return mSeq == that.mSeq
12047a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun                && Objects.equals(mTargetAddr, that.mTargetAddr)
12147a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun                && mEvent == that.mEvent
12247a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun                && Arrays.equals(mData, that.mData);
12347a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    }
12447a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun
12547a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    @Override
12647a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    public int hashCode() {
12747a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun        int result = 1;
12847a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun        result = 31 * result + mSeq;
12947a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun        result = 31 * result + Objects.hashCode(mTargetAddr);
13047a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun        result = 31 * result + mEvent;
13147a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun        result = 31 * result + Arrays.hashCode(mData);
13247a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun        return result;
13347a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    }
13447a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun
13547a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    @Override
13647a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    public String toString() {
13747a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun        return "EuiccNotification (seq="
13847a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun                + mSeq
13947a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun                + ", targetAddr="
14047a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun                + mTargetAddr
14147a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun                + ", event="
14247a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun                + mEvent
14347a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun                + ", data="
14447a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun                + (mData == null ? "null" : "byte[" + mData.length + "]")
14547a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun                + ")";
14647a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    }
14747a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun
14847a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    @Override
14947a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    public int describeContents() {
15047a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun        return 0;
15147a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    }
15247a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun
15347a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    @Override
15447a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    public void writeToParcel(Parcel dest, int flags) {
15547a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun        dest.writeInt(mSeq);
15647a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun        dest.writeString(mTargetAddr);
15747a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun        dest.writeInt(mEvent);
15847a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun        dest.writeByteArray(mData);
15947a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    }
16047a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun
16147a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    private EuiccNotification(Parcel source) {
16247a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun        mSeq = source.readInt();
16347a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun        mTargetAddr = source.readString();
16447a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun        mEvent = source.readInt();
16547a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun        mData = source.createByteArray();
16647a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    }
16747a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun
16847a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun    public static final Creator<EuiccNotification> CREATOR =
16947a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun            new Creator<EuiccNotification>() {
17047a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun                @Override
17147a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun                public EuiccNotification createFromParcel(Parcel source) {
17247a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun                    return new EuiccNotification(source);
17347a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun                }
17447a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun
17547a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun                @Override
17647a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun                public EuiccNotification[] newArray(int size) {
17747a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun                    return new EuiccNotification[size];
17847a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun                }
17947a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun            };
18047a7426ddd9baf14307ad396198163daf6f409c7Holly Jiuyu Sun}
181