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 
17 package android.telephony.ims.feature;
18 
19 import android.annotation.SystemApi;
20 import android.os.Parcel;
21 import android.os.Parcelable;
22 import android.telephony.ims.stub.ImsRegistrationImplBase;
23 import android.util.ArraySet;
24 
25 import java.util.ArrayList;
26 import java.util.List;
27 import java.util.Set;
28 
29 /**
30  * Request to send to IMS provider, which will try to enable/disable capabilities that are added to
31  * the request.
32  * {@hide}
33  */
34 @SystemApi
35 public final class CapabilityChangeRequest implements Parcelable {
36 
37     /**
38      * Contains a feature capability, defined as
39      * {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_VOICE},
40      * {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_VIDEO},
41      * {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_UT}, or
42      * {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_SMS},
43      * along with an associated technology, defined as
44      * {@link ImsRegistrationImplBase#REGISTRATION_TECH_LTE} or
45      * {@link ImsRegistrationImplBase#REGISTRATION_TECH_IWLAN}
46      */
47     public static class CapabilityPair {
48         private final int mCapability;
49         private final int radioTech;
50 
CapabilityPair(@mTelFeature.MmTelCapabilities.MmTelCapability int capability, @ImsRegistrationImplBase.ImsRegistrationTech int radioTech)51         public CapabilityPair(@MmTelFeature.MmTelCapabilities.MmTelCapability int capability,
52                 @ImsRegistrationImplBase.ImsRegistrationTech int radioTech) {
53             this.mCapability = capability;
54             this.radioTech = radioTech;
55         }
56 
57         /**
58          * @hide
59          */
60         @Override
equals(Object o)61         public boolean equals(Object o) {
62             if (this == o) return true;
63             if (!(o instanceof CapabilityPair)) return false;
64 
65             CapabilityPair that = (CapabilityPair) o;
66 
67             if (getCapability() != that.getCapability()) return false;
68             return getRadioTech() == that.getRadioTech();
69         }
70 
71         /**
72          * @hide
73          */
74         @Override
hashCode()75         public int hashCode() {
76             int result = getCapability();
77             result = 31 * result + getRadioTech();
78             return result;
79         }
80 
81         /**
82          * @return The stored capability, defined as
83          * {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_VOICE},
84          * {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_VIDEO},
85          * {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_UT}, or
86          * {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_SMS}
87          */
getCapability()88         public @MmTelFeature.MmTelCapabilities.MmTelCapability int getCapability() {
89             return mCapability;
90         }
91 
92         /**
93          * @return the stored radio technology, defined as
94          * {@link ImsRegistrationImplBase#REGISTRATION_TECH_LTE} or
95          * {@link ImsRegistrationImplBase#REGISTRATION_TECH_IWLAN}
96          */
getRadioTech()97         public @ImsRegistrationImplBase.ImsRegistrationTech int getRadioTech() {
98             return radioTech;
99         }
100     }
101 
102     // Pair contains <radio tech, mCapability>
103     private final Set<CapabilityPair> mCapabilitiesToEnable;
104     // Pair contains <radio tech, mCapability>
105     private final Set<CapabilityPair> mCapabilitiesToDisable;
106 
107     /** @hide */
CapabilityChangeRequest()108     public CapabilityChangeRequest() {
109         mCapabilitiesToEnable = new ArraySet<>();
110         mCapabilitiesToDisable = new ArraySet<>();
111     }
112 
113     /**
114      * Add one or many capabilities to the request to be enabled.
115      *
116      * @param capabilities A bitfield of capabilities to enable, valid values are defined in
117      *   {@link MmTelFeature.MmTelCapabilities.MmTelCapability}.
118      * @param radioTech  the radio tech that these capabilities should be enabled for, valid
119      *   values are in {@link ImsRegistrationImplBase.ImsRegistrationTech}.
120      */
addCapabilitiesToEnableForTech( @mTelFeature.MmTelCapabilities.MmTelCapability int capabilities, @ImsRegistrationImplBase.ImsRegistrationTech int radioTech)121     public void addCapabilitiesToEnableForTech(
122             @MmTelFeature.MmTelCapabilities.MmTelCapability int capabilities,
123             @ImsRegistrationImplBase.ImsRegistrationTech int radioTech) {
124         addAllCapabilities(mCapabilitiesToEnable, capabilities, radioTech);
125     }
126 
127     /**
128      * Add one or many capabilities to the request to be disabled.
129      * @param capabilities A bitfield of capabilities to diable, valid values are defined in
130      *   {@link MmTelFeature.MmTelCapabilities.MmTelCapability}.
131      * @param radioTech the radio tech that these capabilities should be disabled for, valid
132      *   values are in {@link ImsRegistrationImplBase.ImsRegistrationTech}.
133      */
addCapabilitiesToDisableForTech( @mTelFeature.MmTelCapabilities.MmTelCapability int capabilities, @ImsRegistrationImplBase.ImsRegistrationTech int radioTech)134     public void addCapabilitiesToDisableForTech(
135             @MmTelFeature.MmTelCapabilities.MmTelCapability int capabilities,
136             @ImsRegistrationImplBase.ImsRegistrationTech int radioTech) {
137         addAllCapabilities(mCapabilitiesToDisable, capabilities, radioTech);
138     }
139 
140     /**
141      * @return a {@link List} of {@link CapabilityPair}s that are requesting to be enabled.
142      */
getCapabilitiesToEnable()143     public List<CapabilityPair> getCapabilitiesToEnable() {
144         return new ArrayList<>(mCapabilitiesToEnable);
145     }
146 
147     /**
148      * @return a {@link List} of {@link CapabilityPair}s that are requesting to be disabled.
149      */
getCapabilitiesToDisable()150     public List<CapabilityPair> getCapabilitiesToDisable() {
151         return new ArrayList<>(mCapabilitiesToDisable);
152     }
153 
154     // Iterate through capabilities bitfield and add each one as a pair associated with the radio
155     // technology
addAllCapabilities(Set<CapabilityPair> set, int capabilities, int tech)156     private void addAllCapabilities(Set<CapabilityPair> set, int capabilities, int tech) {
157         long highestCapability = Long.highestOneBit(capabilities);
158         for (int i = 1; i <= highestCapability; i *= 2) {
159             if ((i & capabilities) > 0) {
160                 set.add(new CapabilityPair(/*capability*/ i, /*radioTech*/ tech));
161             }
162         }
163     }
164 
165     /**
166      * @hide
167      */
CapabilityChangeRequest(Parcel in)168     protected CapabilityChangeRequest(Parcel in) {
169         int enableSize = in.readInt();
170         mCapabilitiesToEnable = new ArraySet<>(enableSize);
171         for (int i = 0; i < enableSize; i++) {
172             mCapabilitiesToEnable.add(new CapabilityPair(/*capability*/ in.readInt(),
173                     /*radioTech*/ in.readInt()));
174         }
175         int disableSize = in.readInt();
176         mCapabilitiesToDisable = new ArraySet<>(disableSize);
177         for (int i = 0; i < disableSize; i++) {
178             mCapabilitiesToDisable.add(new CapabilityPair(/*capability*/ in.readInt(),
179                     /*radioTech*/ in.readInt()));
180         }
181     }
182 
183     public static final Creator<CapabilityChangeRequest> CREATOR =
184             new Creator<CapabilityChangeRequest>() {
185                 @Override
186                 public CapabilityChangeRequest createFromParcel(Parcel in) {
187                     return new CapabilityChangeRequest(in);
188                 }
189 
190                 @Override
191                 public CapabilityChangeRequest[] newArray(int size) {
192                     return new CapabilityChangeRequest[size];
193                 }
194             };
195 
196     @Override
describeContents()197     public int describeContents() {
198         return 0;
199     }
200 
201     @Override
writeToParcel(Parcel dest, int flags)202     public void writeToParcel(Parcel dest, int flags) {
203         dest.writeInt(mCapabilitiesToEnable.size());
204         for (CapabilityPair pair : mCapabilitiesToEnable) {
205             dest.writeInt(pair.getCapability());
206             dest.writeInt(pair.getRadioTech());
207         }
208         dest.writeInt(mCapabilitiesToDisable.size());
209         for (CapabilityPair pair : mCapabilitiesToDisable) {
210             dest.writeInt(pair.getCapability());
211             dest.writeInt(pair.getRadioTech());
212         }
213     }
214 
215     /**
216      * @hide
217      */
218     @Override
equals(Object o)219     public boolean equals(Object o) {
220         if (this == o) return true;
221         if (!(o instanceof CapabilityChangeRequest)) return false;
222 
223         CapabilityChangeRequest
224                 that = (CapabilityChangeRequest) o;
225 
226         if (!mCapabilitiesToEnable.equals(that.mCapabilitiesToEnable)) return false;
227         return mCapabilitiesToDisable.equals(that.mCapabilitiesToDisable);
228     }
229 
230     /**
231      * @hide
232      */
233     @Override
hashCode()234     public int hashCode() {
235         int result = mCapabilitiesToEnable.hashCode();
236         result = 31 * result + mCapabilitiesToDisable.hashCode();
237         return result;
238     }
239 }
240