1 /*
2  * Copyright (C) 2016 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;
17 
18 import android.os.Parcel;
19 import android.os.Parcelable;
20 import android.telephony.VisualVoicemailService.VisualVoicemailTask;
21 
22 import java.util.Collections;
23 import java.util.List;
24 
25 /**
26  * Class to represent various settings for the visual voicemail SMS filter. When the filter is
27  * enabled, incoming SMS matching the generalized OMTP format:
28  *
29  * <p>[clientPrefix]:[prefix]:([key]=[value];)*
30  *
31  * <p>will be regarded as a visual voicemail SMS, and removed before reaching the SMS provider. The
32  * {@link VisualVoicemailService} in the current default dialer will be bound and
33  * {@link VisualVoicemailService#onSmsReceived(VisualVoicemailTask, VisualVoicemailSms)}
34  * will called with the information extracted from the SMS.
35  *
36  * <p>Use {@link android.telephony.VisualVoicemailSmsFilterSettings.Builder} to construct this
37  * class.
38  *
39  * @see TelephonyManager#setVisualVoicemailSmsFilterSettings(VisualVoicemailSmsFilterSettings)
40  */
41 public final class VisualVoicemailSmsFilterSettings implements Parcelable {
42 
43 
44     /**
45      * The visual voicemail SMS message does not have to be a data SMS, and can be directed to any
46      * port.
47      */
48     public static final int DESTINATION_PORT_ANY = -1;
49 
50     /**
51      * The visual voicemail SMS message can be directed to any port, but must be a data SMS.
52      */
53     public static final int DESTINATION_PORT_DATA_SMS = -2;
54 
55     /**
56      * @hide
57      */
58     public static final String DEFAULT_CLIENT_PREFIX = "//VVM";
59     /**
60      * @hide
61      */
62     public static final List<String> DEFAULT_ORIGINATING_NUMBERS = Collections.emptyList();
63     /**
64      * @hide
65      */
66     public static final int DEFAULT_DESTINATION_PORT = DESTINATION_PORT_ANY;
67 
68     /**
69      * Builder class for {@link VisualVoicemailSmsFilterSettings} objects.
70      */
71     public static class Builder {
72 
73         private String mClientPrefix = DEFAULT_CLIENT_PREFIX;
74         private List<String> mOriginatingNumbers = DEFAULT_ORIGINATING_NUMBERS;
75         private int mDestinationPort = DEFAULT_DESTINATION_PORT;
76         private String mPackageName;
77 
build()78         public VisualVoicemailSmsFilterSettings build() {
79             return new VisualVoicemailSmsFilterSettings(this);
80         }
81 
82         /**
83          * Sets the client prefix for the visual voicemail SMS filter. The client prefix will appear
84          * at the start of a visual voicemail SMS message, followed by a colon(:).
85          */
setClientPrefix(String clientPrefix)86         public Builder setClientPrefix(String clientPrefix) {
87             if (clientPrefix == null) {
88                 throw new IllegalArgumentException("Client prefix cannot be null");
89             }
90             mClientPrefix = clientPrefix;
91             return this;
92         }
93 
94         /**
95          * Sets the originating number allow list for the visual voicemail SMS filter. If the list
96          * is not null only the SMS messages from a number in the list can be considered as a visual
97          * voicemail SMS. Otherwise, messages from any address will be considered.
98          */
setOriginatingNumbers(List<String> originatingNumbers)99         public Builder setOriginatingNumbers(List<String> originatingNumbers) {
100             if (originatingNumbers == null) {
101                 throw new IllegalArgumentException("Originating numbers cannot be null");
102             }
103             mOriginatingNumbers = originatingNumbers;
104             return this;
105         }
106 
107         /**
108          * Sets the destination port for the visual voicemail SMS filter.
109          *
110          * @param destinationPort The destination port, or {@link #DESTINATION_PORT_ANY}, or {@link
111          * #DESTINATION_PORT_DATA_SMS}
112          */
setDestinationPort(int destinationPort)113         public Builder setDestinationPort(int destinationPort) {
114             mDestinationPort = destinationPort;
115             return this;
116         }
117 
118         /**
119          * The package that registered this filter.
120          *
121          * @hide
122          */
setPackageName(String packageName)123         public Builder setPackageName(String packageName) {
124             mPackageName = packageName;
125             return this;
126         }
127     }
128 
129     /**
130      * The client prefix for the visual voicemail SMS filter. The client prefix will appear at the
131      * start of a visual voicemail SMS message, followed by a colon(:).
132      */
133     public final String clientPrefix;
134 
135     /**
136      * The originating number allow list for the visual voicemail SMS filter of a phone account. If
137      * the list is not null only the SMS messages from a number in the list can be considered as a
138      * visual voicemail SMS. Otherwise, messages from any address will be considered.
139      */
140     public final List<String> originatingNumbers;
141 
142     /**
143      * The destination port for the visual voicemail SMS filter, or {@link #DESTINATION_PORT_ANY},
144      * or {@link #DESTINATION_PORT_DATA_SMS}
145      */
146     public final int destinationPort;
147 
148     /**
149      * The package that registered this filter.
150      *
151      * @hide
152      */
153     public final String packageName;
154 
155     /**
156      * Use {@link Builder} to construct
157      */
VisualVoicemailSmsFilterSettings(Builder builder)158     private VisualVoicemailSmsFilterSettings(Builder builder) {
159         clientPrefix = builder.mClientPrefix;
160         originatingNumbers = builder.mOriginatingNumbers;
161         destinationPort = builder.mDestinationPort;
162         packageName = builder.mPackageName;
163     }
164 
165     public static final @android.annotation.NonNull Creator<VisualVoicemailSmsFilterSettings> CREATOR =
166             new Creator<VisualVoicemailSmsFilterSettings>() {
167                 @Override
168                 public VisualVoicemailSmsFilterSettings createFromParcel(Parcel in) {
169                     Builder builder = new Builder();
170                     builder.setClientPrefix(in.readString());
171                     builder.setOriginatingNumbers(in.createStringArrayList());
172                     builder.setDestinationPort(in.readInt());
173                     builder.setPackageName(in.readString());
174                     return builder.build();
175                 }
176 
177                 @Override
178                 public VisualVoicemailSmsFilterSettings[] newArray(int size) {
179                     return new VisualVoicemailSmsFilterSettings[size];
180                 }
181             };
182 
183     @Override
describeContents()184     public int describeContents() {
185         return 0;
186     }
187 
188     @Override
writeToParcel(Parcel dest, int flags)189     public void writeToParcel(Parcel dest, int flags) {
190         dest.writeString(clientPrefix);
191         dest.writeStringList(originatingNumbers);
192         dest.writeInt(destinationPort);
193         dest.writeString(packageName);
194     }
195 
196     @Override
toString()197     public String toString() {
198         return "[VisualVoicemailSmsFilterSettings "
199                 + "clientPrefix=" + clientPrefix
200                 + ", originatingNumbers=" + originatingNumbers
201                 + ", destinationPort=" + destinationPort
202                 + "]";
203     }
204 
205 }
206