1/*
2 * Copyright (C) 2006 The Android Open Source Project
3 * Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
4 * Not a Contribution.
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 *      http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18
19package com.android.internal.telephony;
20
21import android.os.RemoteException;
22import android.os.ServiceManager;
23import android.telephony.SubscriptionManager;
24import android.telephony.Rlog;
25import android.telephony.TelephonyManager;
26
27import java.lang.NullPointerException;
28import java.lang.ArrayIndexOutOfBoundsException;
29
30import com.android.internal.telephony.IPhoneSubInfo;
31import com.android.internal.telephony.Phone;
32import com.android.internal.telephony.PhoneSubInfoProxy;
33
34public class PhoneSubInfoController extends IPhoneSubInfo.Stub {
35    private static final String TAG = "PhoneSubInfoController";
36    private Phone[] mPhone;
37
38    public PhoneSubInfoController(Phone[] phone) {
39        mPhone = phone;
40        if (ServiceManager.getService("iphonesubinfo") == null) {
41            ServiceManager.addService("iphonesubinfo", this);
42        }
43    }
44
45
46    public String getDeviceId() {
47        return getDeviceIdForSubscriber(getDefaultSubscription());
48    }
49
50    public String getDeviceIdForSubscriber(long subId) {
51        PhoneSubInfoProxy phoneSubInfoProxy = getPhoneSubInfoProxy(subId);
52        if (phoneSubInfoProxy != null) {
53            return phoneSubInfoProxy.getDeviceId();
54        } else {
55            Rlog.e(TAG,"getDeviceId phoneSubInfoProxy is null" +
56                      " for Subscription:" + subId);
57            return null;
58        }
59    }
60
61    public String getImeiForSubscriber(long subId) {
62        PhoneSubInfoProxy phoneSubInfoProxy = getPhoneSubInfoProxy(subId);
63        if (phoneSubInfoProxy != null) {
64            return phoneSubInfoProxy.getImei();
65        } else {
66            Rlog.e(TAG,"getDeviceId phoneSubInfoProxy is null" +
67                    " for Subscription:" + subId);
68            return null;
69        }
70    }
71
72    public String getDeviceSvn() {
73        PhoneSubInfoProxy phoneSubInfoProxy = getPhoneSubInfoProxy(getDefaultSubscription());
74        if (phoneSubInfoProxy != null) {
75            return phoneSubInfoProxy.getDeviceSvn();
76        } else {
77            Rlog.e(TAG,"getDeviceSvn phoneSubInfoProxy is null");
78            return null;
79        }
80    }
81
82    public String getSubscriberId() {
83        return getSubscriberIdForSubscriber(getDefaultSubscription());
84    }
85
86    public String getSubscriberIdForSubscriber(long subId) {
87        PhoneSubInfoProxy phoneSubInfoProxy = getPhoneSubInfoProxy(subId);
88        if (phoneSubInfoProxy != null) {
89            return phoneSubInfoProxy.getSubscriberId();
90        } else {
91            Rlog.e(TAG,"getSubscriberId phoneSubInfoProxy is" +
92                      " null for Subscription:" + subId);
93            return null;
94        }
95    }
96
97    /**
98     * Retrieves the serial number of the ICC, if applicable.
99     */
100    public String getIccSerialNumber() {
101        return getIccSerialNumberForSubscriber(getDefaultSubscription());
102    }
103
104    public String getIccSerialNumberForSubscriber(long subId) {
105        PhoneSubInfoProxy phoneSubInfoProxy = getPhoneSubInfoProxy(subId);
106        if (phoneSubInfoProxy != null) {
107            return phoneSubInfoProxy.getIccSerialNumber();
108        } else {
109            Rlog.e(TAG,"getIccSerialNumber phoneSubInfoProxy is" +
110                      " null for Subscription:" + subId);
111            return null;
112        }
113    }
114
115    public String getLine1Number() {
116        return getLine1NumberForSubscriber(getDefaultSubscription());
117    }
118
119    public String getLine1NumberForSubscriber(long subId) {
120        PhoneSubInfoProxy phoneSubInfoProxy = getPhoneSubInfoProxy(subId);
121        if (phoneSubInfoProxy != null) {
122            return phoneSubInfoProxy.getLine1Number();
123        } else {
124            Rlog.e(TAG,"getLine1Number phoneSubInfoProxy is" +
125                      " null for Subscription:" + subId);
126            return null;
127        }
128    }
129
130    public String getLine1AlphaTag() {
131        return getLine1AlphaTagForSubscriber(getDefaultSubscription());
132    }
133
134    public String getLine1AlphaTagForSubscriber(long subId) {
135        PhoneSubInfoProxy phoneSubInfoProxy = getPhoneSubInfoProxy(subId);
136        if (phoneSubInfoProxy != null) {
137            return phoneSubInfoProxy.getLine1AlphaTag();
138        } else {
139            Rlog.e(TAG,"getLine1AlphaTag phoneSubInfoProxy is" +
140                      " null for Subscription:" + subId);
141            return null;
142        }
143    }
144
145    public String getMsisdn() {
146        return getMsisdnForSubscriber(getDefaultSubscription());
147    }
148
149    public String getMsisdnForSubscriber(long subId) {
150        PhoneSubInfoProxy phoneSubInfoProxy = getPhoneSubInfoProxy(subId);
151        if (phoneSubInfoProxy != null) {
152            return phoneSubInfoProxy.getMsisdn();
153        } else {
154            Rlog.e(TAG,"getMsisdn phoneSubInfoProxy is" +
155                      " null for Subscription:" + subId);
156            return null;
157        }
158    }
159
160    public String getVoiceMailNumber() {
161        return getVoiceMailNumberForSubscriber(getDefaultSubscription());
162    }
163
164    public String getVoiceMailNumberForSubscriber(long subId) {
165        PhoneSubInfoProxy phoneSubInfoProxy = getPhoneSubInfoProxy(subId);
166        if (phoneSubInfoProxy != null) {
167            return phoneSubInfoProxy.getVoiceMailNumber();
168        } else {
169            Rlog.e(TAG,"getVoiceMailNumber phoneSubInfoProxy is" +
170                      " null for Subscription:" + subId);
171            return null;
172        }
173    }
174
175    public String getCompleteVoiceMailNumber() {
176        return getCompleteVoiceMailNumberForSubscriber(getDefaultSubscription());
177    }
178
179    public String getCompleteVoiceMailNumberForSubscriber(long subId) {
180        PhoneSubInfoProxy phoneSubInfoProxy = getPhoneSubInfoProxy(subId);
181        if (phoneSubInfoProxy != null) {
182            return phoneSubInfoProxy.getCompleteVoiceMailNumber();
183        } else {
184            Rlog.e(TAG,"getCompleteVoiceMailNumber phoneSubInfoProxy" +
185                      " is null for Subscription:" + subId);
186            return null;
187        }
188    }
189
190    public String getVoiceMailAlphaTag() {
191        return getVoiceMailAlphaTagForSubscriber(getDefaultSubscription());
192    }
193
194    public String getVoiceMailAlphaTagForSubscriber(long subId) {
195        PhoneSubInfoProxy phoneSubInfoProxy = getPhoneSubInfoProxy(subId);
196        if (phoneSubInfoProxy != null) {
197            return phoneSubInfoProxy.getVoiceMailAlphaTag();
198        } else {
199            Rlog.e(TAG,"getVoiceMailAlphaTag phoneSubInfoProxy is" +
200                      " null for Subscription:" + subId);
201            return null;
202        }
203    }
204
205    /**
206     * get Phone sub info proxy object based on subId.
207     **/
208    private PhoneSubInfoProxy getPhoneSubInfoProxy(long subId) {
209
210        long phoneId = SubscriptionManager.getPhoneId(subId);
211        if (phoneId < 0 || phoneId >= TelephonyManager.getDefault().getPhoneCount()) {
212            phoneId = 0;
213        }
214
215        try {
216            return ((PhoneProxy)mPhone[(int)phoneId]).getPhoneSubInfoProxy();
217        } catch (NullPointerException e) {
218            Rlog.e(TAG, "Exception is :" + e.toString() + " For subId :" + subId);
219            e.printStackTrace();
220            return null;
221        } catch (ArrayIndexOutOfBoundsException e) {
222            Rlog.e(TAG, "Exception is :" + e.toString() + " For subId :" + subId);
223            e.printStackTrace();
224            return null;
225        }
226    }
227
228    private long getDefaultSubscription() {
229        return  PhoneFactory.getDefaultSubscription();
230    }
231
232
233    public String getIsimImpi() {
234        PhoneSubInfoProxy phoneSubInfoProxy = getPhoneSubInfoProxy(getDefaultSubscription());
235        return phoneSubInfoProxy.getIsimImpi();
236    }
237
238    public String getIsimDomain() {
239        PhoneSubInfoProxy phoneSubInfoProxy = getPhoneSubInfoProxy(getDefaultSubscription());
240        return phoneSubInfoProxy.getIsimDomain();
241    }
242
243    public String[] getIsimImpu() {
244        PhoneSubInfoProxy phoneSubInfoProxy = getPhoneSubInfoProxy(getDefaultSubscription());
245        return phoneSubInfoProxy.getIsimImpu();
246    }
247
248    public String getIsimIst() throws RemoteException {
249        PhoneSubInfoProxy phoneSubInfoProxy = getPhoneSubInfoProxy(getDefaultSubscription());
250        return phoneSubInfoProxy.getIsimIst();
251    }
252
253    public String[] getIsimPcscf() throws RemoteException {
254        PhoneSubInfoProxy phoneSubInfoProxy = getPhoneSubInfoProxy(getDefaultSubscription());
255        return phoneSubInfoProxy.getIsimPcscf();
256    }
257
258    public String getIsimChallengeResponse(String nonce) throws RemoteException {
259        PhoneSubInfoProxy phoneSubInfoProxy = getPhoneSubInfoProxy(getDefaultSubscription());
260        return phoneSubInfoProxy.getIsimChallengeResponse(nonce);
261    }
262
263    public String getIccSimChallengeResponse(long subId, int appType, String data)
264            throws RemoteException {
265        PhoneSubInfoProxy phoneSubInfoProxy = getPhoneSubInfoProxy(subId);
266        return phoneSubInfoProxy.getIccSimChallengeResponse(subId, appType, data);
267    }
268
269     public String getGroupIdLevel1() {
270         return getGroupIdLevel1ForSubscriber(getDefaultSubscription());
271     }
272
273     public String getGroupIdLevel1ForSubscriber(long subId) {
274         PhoneSubInfoProxy phoneSubInfoProxy = getPhoneSubInfoProxy(subId);
275         if (phoneSubInfoProxy != null) {
276             return phoneSubInfoProxy.getGroupIdLevel1();
277         } else {
278             Rlog.e(TAG,"getGroupIdLevel1 phoneSubInfoProxy is" +
279                       " null for Subscription:" + subId);
280             return null;
281         }
282     }
283}
284