• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 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 
17 package android.telephony.satellite;
18 
19 import android.annotation.NonNull;
20 import android.annotation.Nullable;
21 import android.annotation.SystemApi;
22 import android.os.Parcel;
23 import android.os.Parcelable;
24 
25 import java.util.HashMap;
26 import java.util.HashSet;
27 import java.util.Map;
28 import java.util.Objects;
29 import java.util.Set;
30 
31 /**
32  * SatelliteCapabilities is used to represent the capabilities of the satellite service
33  * received from satellite modem.
34  * @hide
35  */
36 @SystemApi
37 public final class SatelliteCapabilities implements Parcelable {
38     /**
39      * List of technologies supported by the satellite modem.
40      */
41     @NonNull @SatelliteManager.NTRadioTechnology private Set<Integer> mSupportedRadioTechnologies;
42 
43     /**
44      * Whether UE needs to point to a satellite to send and receive data.
45      */
46     private boolean mIsPointingRequired;
47 
48     /**
49      * The maximum number of bytes per datagram that can be sent over satellite.
50      */
51     private int mMaxBytesPerOutgoingDatagram;
52 
53     /**
54      * Antenna Position received from satellite modem which gives information about antenna
55      * direction to be used with satellite communication and suggested device hold positions.
56      * Map key: {@link SatelliteManager.DeviceHoldPosition} value: AntennaPosition
57      */
58     @NonNull
59     private Map<Integer, AntennaPosition> mAntennaPositionMap;
60 
61     /**
62      * @hide
63      */
SatelliteCapabilities(@ullable Set<Integer> supportedRadioTechnologies, boolean isPointingRequired, int maxBytesPerOutgoingDatagram, @NonNull Map<Integer, AntennaPosition> antennaPositionMap)64     public SatelliteCapabilities(@Nullable Set<Integer> supportedRadioTechnologies,
65             boolean isPointingRequired, int maxBytesPerOutgoingDatagram,
66             @NonNull Map<Integer, AntennaPosition> antennaPositionMap) {
67         mSupportedRadioTechnologies = supportedRadioTechnologies == null
68                 ? new HashSet<>() : supportedRadioTechnologies;
69         mIsPointingRequired = isPointingRequired;
70         mMaxBytesPerOutgoingDatagram = maxBytesPerOutgoingDatagram;
71         mAntennaPositionMap = antennaPositionMap;
72     }
73 
SatelliteCapabilities(Parcel in)74     private SatelliteCapabilities(Parcel in) {
75         readFromParcel(in);
76     }
77 
78     @Override
describeContents()79     public int describeContents() {
80         return 0;
81     }
82 
83     @Override
writeToParcel(@onNull Parcel out, int flags)84     public void writeToParcel(@NonNull Parcel out, int flags) {
85         if (mSupportedRadioTechnologies != null && !mSupportedRadioTechnologies.isEmpty()) {
86             out.writeInt(mSupportedRadioTechnologies.size());
87             for (int technology : mSupportedRadioTechnologies) {
88                 out.writeInt(technology);
89             }
90         } else {
91             out.writeInt(0);
92         }
93 
94         out.writeBoolean(mIsPointingRequired);
95         out.writeInt(mMaxBytesPerOutgoingDatagram);
96 
97         if (mAntennaPositionMap != null && !mAntennaPositionMap.isEmpty()) {
98             int size = mAntennaPositionMap.size();
99             out.writeInt(size);
100             for (Map.Entry<Integer, AntennaPosition> entry : mAntennaPositionMap.entrySet()) {
101                 out.writeInt(entry.getKey());
102                 out.writeParcelable(entry.getValue(), flags);
103             }
104         } else {
105             out.writeInt(0);
106         }
107     }
108 
109     @NonNull public static final Creator<SatelliteCapabilities> CREATOR = new Creator<>() {
110         @Override
111         public SatelliteCapabilities createFromParcel(Parcel in) {
112             return new SatelliteCapabilities(in);
113         }
114 
115         @Override
116         public SatelliteCapabilities[] newArray(int size) {
117             return new SatelliteCapabilities[size];
118         }
119     };
120 
121     @Override
toString()122     @NonNull public String toString() {
123         StringBuilder sb = new StringBuilder();
124 
125         sb.append("SupportedRadioTechnology:");
126         if (mSupportedRadioTechnologies != null && !mSupportedRadioTechnologies.isEmpty()) {
127             for (int technology : mSupportedRadioTechnologies) {
128                 sb.append(technology);
129                 sb.append(",");
130             }
131         } else {
132             sb.append("none,");
133         }
134 
135         sb.append("isPointingRequired:");
136         sb.append(mIsPointingRequired);
137         sb.append(",");
138 
139         sb.append("maxBytesPerOutgoingDatagram:");
140         sb.append(mMaxBytesPerOutgoingDatagram);
141         sb.append(",");
142 
143         sb.append("antennaPositionMap:");
144         sb.append(mAntennaPositionMap);
145         return sb.toString();
146     }
147 
148     @Override
equals(Object o)149     public boolean equals(Object o) {
150         if (this == o) return true;
151         if (o == null || getClass() != o.getClass()) return false;
152         SatelliteCapabilities that = (SatelliteCapabilities) o;
153         return Objects.equals(mSupportedRadioTechnologies, that.mSupportedRadioTechnologies)
154                 && mIsPointingRequired == that.mIsPointingRequired
155                 && mMaxBytesPerOutgoingDatagram == that.mMaxBytesPerOutgoingDatagram
156                 && Objects.equals(mAntennaPositionMap, that.mAntennaPositionMap);
157     }
158 
159     @Override
hashCode()160     public int hashCode() {
161         return Objects.hash(mSupportedRadioTechnologies, mIsPointingRequired,
162                 mMaxBytesPerOutgoingDatagram, mAntennaPositionMap);
163     }
164 
165     /**
166      * @return The list of technologies supported by the satellite modem.
167      */
168     @NonNull @SatelliteManager.NTRadioTechnology public Set<Integer>
getSupportedRadioTechnologies()169             getSupportedRadioTechnologies() {
170         return mSupportedRadioTechnologies;
171     }
172 
173     /**
174      * Get whether UE needs to point to a satellite to send and receive data.
175      *
176      * @return {@code true} if UE needs to point to a satellite to send and receive data and
177      *         {@code false} otherwise.
178      */
isPointingRequired()179     public boolean isPointingRequired() {
180         return mIsPointingRequired;
181     }
182 
183     /**
184      * The maximum number of bytes per datagram that can be sent over satellite.
185      *
186      * @return The maximum number of bytes per datagram that can be sent over satellite.
187      */
getMaxBytesPerOutgoingDatagram()188     public int getMaxBytesPerOutgoingDatagram() {
189         return mMaxBytesPerOutgoingDatagram;
190     }
191 
192     /**
193      * Setting the maximum number of bytes per datagram that can be sent over satellite.
194      *
195      * @hide
196      */
setMaxBytesPerOutgoingDatagram(int maxBytesPerOutgoingDatagram)197     public void setMaxBytesPerOutgoingDatagram(int maxBytesPerOutgoingDatagram) {
198         mMaxBytesPerOutgoingDatagram = maxBytesPerOutgoingDatagram;
199     }
200 
201     /**
202      * Antenna Position received from satellite modem which gives information about antenna
203      * direction to be used with satellite communication and suggested device hold positions.
204      * @return Map key: {@link SatelliteManager.DeviceHoldPosition} value: AntennaPosition
205      */
206     @NonNull
getAntennaPositionMap()207     public Map<Integer, AntennaPosition> getAntennaPositionMap() {
208         return mAntennaPositionMap;
209     }
210 
readFromParcel(Parcel in)211     private void readFromParcel(Parcel in) {
212         mSupportedRadioTechnologies = new HashSet<>();
213         int numSupportedRadioTechnologies = in.readInt();
214         if (numSupportedRadioTechnologies > 0) {
215             for (int i = 0; i < numSupportedRadioTechnologies; i++) {
216                 mSupportedRadioTechnologies.add(in.readInt());
217             }
218         }
219 
220         mIsPointingRequired = in.readBoolean();
221         mMaxBytesPerOutgoingDatagram = in.readInt();
222 
223         mAntennaPositionMap = new HashMap<>();
224         int antennaPositionMapSize = in.readInt();
225         for (int i = 0; i < antennaPositionMapSize; i++) {
226             int key = in.readInt();
227             AntennaPosition antennaPosition = in.readParcelable(
228                     AntennaPosition.class.getClassLoader(), AntennaPosition.class);
229             mAntennaPositionMap.put(key, antennaPosition);
230         }
231     }
232 }
233