1 /* 2 * Copyright (C) 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package android.telephony.euicc; 17 18 import android.annotation.IntDef; 19 import android.annotation.Nullable; 20 import android.annotation.SystemApi; 21 import android.os.Parcel; 22 import android.os.Parcelable; 23 24 import java.lang.annotation.Retention; 25 import java.lang.annotation.RetentionPolicy; 26 import java.util.Arrays; 27 import java.util.Objects; 28 29 /** 30 * This represents a signed notification which is defined in SGP.22. It can be either a profile 31 * installation result or a notification generated for profile operations (e.g., enabling, 32 * disabling, or deleting). 33 * 34 * @hide 35 */ 36 @SystemApi 37 public final class EuiccNotification implements Parcelable { 38 /** Event */ 39 @Retention(RetentionPolicy.SOURCE) 40 @IntDef(flag = true, prefix = { "EVENT_" }, value = { 41 EVENT_INSTALL, 42 EVENT_ENABLE, 43 EVENT_DISABLE, 44 EVENT_DELETE 45 }) 46 /** @hide */ 47 public @interface Event {} 48 49 /** A profile is downloaded and installed. */ 50 public static final int EVENT_INSTALL = 1; 51 52 /** A profile is enabled. */ 53 public static final int EVENT_ENABLE = 1 << 1; 54 55 /** A profile is disabled. */ 56 public static final int EVENT_DISABLE = 1 << 2; 57 58 /** A profile is deleted. */ 59 public static final int EVENT_DELETE = 1 << 3; 60 61 /** Value of the bits of all the events including install, enable, disable and delete. */ 62 @Event 63 public static final int ALL_EVENTS = 64 EVENT_INSTALL | EVENT_ENABLE | EVENT_DISABLE | EVENT_DELETE; 65 66 private final int mSeq; 67 private final String mTargetAddr; 68 @Event private final int mEvent; 69 @Nullable private final byte[] mData; 70 71 /** 72 * Creates an instance. 73 * 74 * @param seq The sequence number of this notification. 75 * @param targetAddr The target server where to send this notification. 76 * @param event The event which causes this notification. 77 * @param data The data which needs to be sent to the target server. This can be null for 78 * building a list of notification metadata without data. 79 */ 80 public EuiccNotification(int seq, String targetAddr, @Event int event, @Nullable byte[] data) { 81 mSeq = seq; 82 mTargetAddr = targetAddr; 83 mEvent = event; 84 mData = data; 85 } 86 87 /** @return The sequence number of this notification. */ 88 public int getSeq() { 89 return mSeq; 90 } 91 92 /** @return The target server address where this notification should be sent to. */ 93 public String getTargetAddr() { 94 return mTargetAddr; 95 } 96 97 /** @return The event of this notification. */ 98 @Event 99 public int getEvent() { 100 return mEvent; 101 } 102 103 /** @return The notification data which needs to be sent to the target server. */ 104 @Nullable 105 public byte[] getData() { 106 return mData; 107 } 108 109 @Override 110 public boolean equals(Object obj) { 111 if (this == obj) { 112 return true; 113 } 114 if (obj == null || getClass() != obj.getClass()) { 115 return false; 116 } 117 118 EuiccNotification that = (EuiccNotification) obj; 119 return mSeq == that.mSeq 120 && Objects.equals(mTargetAddr, that.mTargetAddr) 121 && mEvent == that.mEvent 122 && Arrays.equals(mData, that.mData); 123 } 124 125 @Override 126 public int hashCode() { 127 int result = 1; 128 result = 31 * result + mSeq; 129 result = 31 * result + Objects.hashCode(mTargetAddr); 130 result = 31 * result + mEvent; 131 result = 31 * result + Arrays.hashCode(mData); 132 return result; 133 } 134 135 @Override 136 public String toString() { 137 return "EuiccNotification (seq=" 138 + mSeq 139 + ", targetAddr=" 140 + mTargetAddr 141 + ", event=" 142 + mEvent 143 + ", data=" 144 + (mData == null ? "null" : "byte[" + mData.length + "]") 145 + ")"; 146 } 147 148 @Override 149 public int describeContents() { 150 return 0; 151 } 152 153 @Override 154 public void writeToParcel(Parcel dest, int flags) { 155 dest.writeInt(mSeq); 156 dest.writeString(mTargetAddr); 157 dest.writeInt(mEvent); 158 dest.writeByteArray(mData); 159 } 160 161 private EuiccNotification(Parcel source) { 162 mSeq = source.readInt(); 163 mTargetAddr = source.readString(); 164 mEvent = source.readInt(); 165 mData = source.createByteArray(); 166 } 167 168 public static final Creator<EuiccNotification> CREATOR = 169 new Creator<EuiccNotification>() { 170 @Override 171 public EuiccNotification createFromParcel(Parcel source) { 172 return new EuiccNotification(source); 173 } 174 175 @Override 176 public EuiccNotification[] newArray(int size) { 177 return new EuiccNotification[size]; 178 } 179 }; 180 } 181