1fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville/*
2f5bca080a231e45e1694651c012c74ba52436635Wink Saville * Copyright (C) 2014 The Android Open Source Project
3f5bca080a231e45e1694651c012c74ba52436635Wink Saville *
4f5bca080a231e45e1694651c012c74ba52436635Wink Saville * Licensed under the Apache License, Version 2.0 (the "License");
5f5bca080a231e45e1694651c012c74ba52436635Wink Saville * you may not use this file except in compliance with the License.
6f5bca080a231e45e1694651c012c74ba52436635Wink Saville * You may obtain a copy of the License at
7f5bca080a231e45e1694651c012c74ba52436635Wink Saville *
8f5bca080a231e45e1694651c012c74ba52436635Wink Saville *      http://www.apache.org/licenses/LICENSE-2.0
9f5bca080a231e45e1694651c012c74ba52436635Wink Saville *
10f5bca080a231e45e1694651c012c74ba52436635Wink Saville * Unless required by applicable law or agreed to in writing, software
11f5bca080a231e45e1694651c012c74ba52436635Wink Saville * distributed under the License is distributed on an "AS IS" BASIS,
12f5bca080a231e45e1694651c012c74ba52436635Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f5bca080a231e45e1694651c012c74ba52436635Wink Saville * See the License for the specific language governing permissions and
14f5bca080a231e45e1694651c012c74ba52436635Wink Saville * limitations under the License.
15f5bca080a231e45e1694651c012c74ba52436635Wink Saville */
16fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
17fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Savillepackage android.telephony;
18fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
193256601f5e4d94713f59e97b9d4912875c1bdcafJeff Sharkeyimport android.annotation.NonNull;
20c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Savilleimport android.annotation.SdkConstant;
21c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Savilleimport android.annotation.SdkConstant.SdkConstantType;
22a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Savilleimport android.content.Context;
23fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Savilleimport android.content.Intent;
24fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Savilleimport android.net.Uri;
25fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Savilleimport android.telephony.Rlog;
26d09c4cad65c708f2c4810d24295456708a2000d2Wink Savilleimport android.os.Handler;
27d09c4cad65c708f2c4810d24295456708a2000d2Wink Savilleimport android.os.Message;
28fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Savilleimport android.os.ServiceManager;
29fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Savilleimport android.os.RemoteException;
30fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
31fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Savilleimport com.android.internal.telephony.ISub;
32d09c4cad65c708f2c4810d24295456708a2000d2Wink Savilleimport com.android.internal.telephony.IOnSubscriptionsChangedListener;
33a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Savilleimport com.android.internal.telephony.ITelephonyRegistry;
34fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Savilleimport com.android.internal.telephony.PhoneConstants;
35d09c4cad65c708f2c4810d24295456708a2000d2Wink Savilleimport com.android.internal.telephony.TelephonyProperties;
367a96207e2ba549843e9fcbbc7f2fde7ed96ada84Tom Taylor
37905bb54108d380555dbec1c9961a675740fe6e96Wink Savilleimport java.util.ArrayList;
38fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Savilleimport java.util.List;
39fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
40fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville/**
41f5bca080a231e45e1694651c012c74ba52436635Wink Saville * SubscriptionManager is the application interface to SubscriptionController
42f5bca080a231e45e1694651c012c74ba52436635Wink Saville * and provides information about the current Telephony Subscriptions.
43d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville * * <p>
44d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville * You do not instantiate this class directly; instead, you retrieve
45d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville * a reference to an instance through {@link #from}.
46d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville * <p>
47d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville * All SDK public methods require android.Manifest.permission.READ_PHONE_STATE.
48fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville */
49d09c4cad65c708f2c4810d24295456708a2000d2Wink Savillepublic class SubscriptionManager {
50d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    private static final String LOG_TAG = "SubscriptionManager";
51d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    private static final boolean DBG = false;
52fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    private static final boolean VDBG = false;
53fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
54a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville    /** An invalid subscription identifier */
5598513d7bd44fe9ce14733c8162544c2114f8f21bWink Saville    /** @hide */
56d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public static final int INVALID_SUBSCRIPTION_ID = -1;
57d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville
58d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    /** Base value for Dummy SUBSCRIPTION_ID's. */
59d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    /** FIXME: Remove DummySubId's, but for now have them map just below INVALID_SUBSCRIPTION_ID
60d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    /** @hide */
61d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public static final int DUMMY_SUBSCRIPTION_ID_BASE = INVALID_SUBSCRIPTION_ID - 1;
62a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville
63905bb54108d380555dbec1c9961a675740fe6e96Wink Saville    /** An invalid phone identifier */
64a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville    /** @hide */
65d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public static final int INVALID_PHONE_INDEX = -1;
66a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville
67a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville    /** An invalid slot identifier */
68a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville    /** @hide */
69d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public static final int INVALID_SIM_SLOT_INDEX = -1;
70a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville
71a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville    /** Indicates the caller wants the default sub id. */
72a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville    /** @hide */
73d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public static final int DEFAULT_SUBSCRIPTION_ID = Integer.MAX_VALUE;
74c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville
75d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    /**
76d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * Indicates the caller wants the default phone id.
77d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * Used in SubscriptionController and PhoneBase but do we really need it???
78d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * @hide
79d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     */
80d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public static final int DEFAULT_PHONE_INDEX = Integer.MAX_VALUE;
81c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville
82d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    /** Indicates the caller wants the default slot id. NOT used remove? */
83f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
84d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public static final int DEFAULT_SIM_SLOT_INDEX = Integer.MAX_VALUE;
85c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville
868eab2b6bdffc3a5934796d074f541f1020b26f30Wink Saville    /** Minimum possible subid that represents a subscription */
878eab2b6bdffc3a5934796d074f541f1020b26f30Wink Saville    /** @hide */
88d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public static final int MIN_SUBSCRIPTION_ID_VALUE = 0;
898eab2b6bdffc3a5934796d074f541f1020b26f30Wink Saville
908eab2b6bdffc3a5934796d074f541f1020b26f30Wink Saville    /** Maximum possible subid that represents a subscription */
918eab2b6bdffc3a5934796d074f541f1020b26f30Wink Saville    /** @hide */
92d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public static final int MAX_SUBSCRIPTION_ID_VALUE = DEFAULT_SUBSCRIPTION_ID - 1;
93fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
94baf21da1e17ef358632c078128d381b3be218a08Wink Saville    /** @hide */
952d1ee982276f5dbd0e035778b731b48e4ef34515Wink Saville    public static final Uri CONTENT_URI = Uri.parse("content://telephony/siminfo");
96baf21da1e17ef358632c078128d381b3be218a08Wink Saville
97baf21da1e17ef358632c078128d381b3be218a08Wink Saville    /**
98d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * TelephonyProvider unique key column name is the subscription id.
99d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * <P>Type: TEXT (String)</P>
100d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     */
101d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    /** @hide */
102d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public static final String UNIQUE_KEY_SUBSCRIPTION_ID = "_id";
103d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville
104d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    /**
105d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * TelephonyProvider column name for SIM ICC Identifier
106fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     * <P>Type: TEXT (String)</P>
107fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     */
108f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
109fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    public static final String ICC_ID = "icc_id";
110fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
111fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    /**
112d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * TelephonyProvider column name for user SIM_SlOT_INDEX
113fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     * <P>Type: INTEGER (int)</P>
114fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     */
115f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
116d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public static final String SIM_SLOT_INDEX = "sim_id";
117905bb54108d380555dbec1c9961a675740fe6e96Wink Saville
118905bb54108d380555dbec1c9961a675740fe6e96Wink Saville    /** SIM is not inserted */
119a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville    /** @hide */
120fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    public static final int SIM_NOT_INSERTED = -1;
121fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
122fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    /**
123905bb54108d380555dbec1c9961a675740fe6e96Wink Saville     * TelephonyProvider column name for user displayed name.
124fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     * <P>Type: TEXT (String)</P>
125fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     */
126f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
127fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    public static final String DISPLAY_NAME = "display_name";
128fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
129905bb54108d380555dbec1c9961a675740fe6e96Wink Saville    /**
130e1013f964dc4eeb28521ed860005e1e21907b0ffSanket Padawe     * TelephonyProvider column name for the service provider name for the SIM.
131e1013f964dc4eeb28521ed860005e1e21907b0ffSanket Padawe     * <P>Type: TEXT (String)</P>
132e1013f964dc4eeb28521ed860005e1e21907b0ffSanket Padawe     */
133e1013f964dc4eeb28521ed860005e1e21907b0ffSanket Padawe    /** @hide */
134e1013f964dc4eeb28521ed860005e1e21907b0ffSanket Padawe    public static final String CARRIER_NAME = "carrier_name";
135e1013f964dc4eeb28521ed860005e1e21907b0ffSanket Padawe
136e1013f964dc4eeb28521ed860005e1e21907b0ffSanket Padawe    /**
137905bb54108d380555dbec1c9961a675740fe6e96Wink Saville     * Default name resource
138905bb54108d380555dbec1c9961a675740fe6e96Wink Saville     * @hide
139905bb54108d380555dbec1c9961a675740fe6e96Wink Saville     */
140fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    public static final int DEFAULT_NAME_RES = com.android.internal.R.string.unknownName;
141fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
142fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    /**
143905bb54108d380555dbec1c9961a675740fe6e96Wink Saville     * TelephonyProvider column name for source of the user displayed name.
144905bb54108d380555dbec1c9961a675740fe6e96Wink Saville     * <P>Type: INT (int)</P> with one of the NAME_SOURCE_XXXX values below
145905bb54108d380555dbec1c9961a675740fe6e96Wink Saville     *
146905bb54108d380555dbec1c9961a675740fe6e96Wink Saville     * @hide
147fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     */
148fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    public static final String NAME_SOURCE = "name_source";
149fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
150905bb54108d380555dbec1c9961a675740fe6e96Wink Saville    /**
151905bb54108d380555dbec1c9961a675740fe6e96Wink Saville     * The name_source is undefined
152905bb54108d380555dbec1c9961a675740fe6e96Wink Saville     * @hide
153905bb54108d380555dbec1c9961a675740fe6e96Wink Saville     */
154c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville    public static final int NAME_SOURCE_UNDEFINDED = -1;
155c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville
156905bb54108d380555dbec1c9961a675740fe6e96Wink Saville    /**
157905bb54108d380555dbec1c9961a675740fe6e96Wink Saville     * The name_source is the default
158905bb54108d380555dbec1c9961a675740fe6e96Wink Saville     * @hide
159905bb54108d380555dbec1c9961a675740fe6e96Wink Saville     */
160c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville    public static final int NAME_SOURCE_DEFAULT_SOURCE = 0;
161fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
162905bb54108d380555dbec1c9961a675740fe6e96Wink Saville    /**
163905bb54108d380555dbec1c9961a675740fe6e96Wink Saville     * The name_source is from the SIM
164905bb54108d380555dbec1c9961a675740fe6e96Wink Saville     * @hide
165905bb54108d380555dbec1c9961a675740fe6e96Wink Saville     */
166c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville    public static final int NAME_SOURCE_SIM_SOURCE = 1;
167fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
168905bb54108d380555dbec1c9961a675740fe6e96Wink Saville    /**
169905bb54108d380555dbec1c9961a675740fe6e96Wink Saville     * The name_source is from the user
170905bb54108d380555dbec1c9961a675740fe6e96Wink Saville     * @hide
171905bb54108d380555dbec1c9961a675740fe6e96Wink Saville     */
172c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville    public static final int NAME_SOURCE_USER_INPUT = 2;
173fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
174fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    /**
175905bb54108d380555dbec1c9961a675740fe6e96Wink Saville     * TelephonyProvider column name for the color of a SIM.
176fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     * <P>Type: INTEGER (int)</P>
177fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     */
178f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
179fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    public static final String COLOR = "color";
180fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
181f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
182fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    public static final int COLOR_1 = 0;
183fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
184f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
185fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    public static final int COLOR_2 = 1;
186fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
187f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
188fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    public static final int COLOR_3 = 2;
189fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
190f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
191fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    public static final int COLOR_4 = 3;
192fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
193f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
194fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    public static final int COLOR_DEFAULT = COLOR_1;
195fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
196fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    /**
197905bb54108d380555dbec1c9961a675740fe6e96Wink Saville     * TelephonyProvider column name for the phone number of a SIM.
198fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     * <P>Type: TEXT (String)</P>
199fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     */
200f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
201fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    public static final String NUMBER = "number";
202fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
203fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    /**
204905bb54108d380555dbec1c9961a675740fe6e96Wink Saville     * TelephonyProvider column name for the number display format of a SIM.
205fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     * <P>Type: INTEGER (int)</P>
206fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     */
207f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
208fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    public static final String DISPLAY_NUMBER_FORMAT = "display_number_format";
209fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
210f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
211c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville    public static final int DISPLAY_NUMBER_NONE = 0;
212fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
213f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
214fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    public static final int DISPLAY_NUMBER_FIRST = 1;
215fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
216f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
217fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    public static final int DISPLAY_NUMBER_LAST = 2;
218fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
219f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
22095fc99b33418f228aa0390032ad466814d33b164Stuart Scott    public static final int DISPLAY_NUMBER_DEFAULT = DISPLAY_NUMBER_FIRST;
221fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
222fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    /**
223905bb54108d380555dbec1c9961a675740fe6e96Wink Saville     * TelephonyProvider column name for permission for data roaming of a SIM.
224fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     * <P>Type: INTEGER (int)</P>
225fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     */
226f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
227fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    public static final String DATA_ROAMING = "data_roaming";
228fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
229400a3f6df20b92e639f20956301a36beb67b511bStuart Scott    /** Indicates that data roaming is enabled for a subscription */
230fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    public static final int DATA_ROAMING_ENABLE = 1;
231fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
232400a3f6df20b92e639f20956301a36beb67b511bStuart Scott    /** Indicates that data roaming is disabled for a subscription */
233fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    public static final int DATA_ROAMING_DISABLE = 0;
234fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
235f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
236fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    public static final int DATA_ROAMING_DEFAULT = DATA_ROAMING_DISABLE;
237fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
2387a96207e2ba549843e9fcbbc7f2fde7ed96ada84Tom Taylor    /**
239905bb54108d380555dbec1c9961a675740fe6e96Wink Saville     * TelephonyProvider column name for the MCC associated with a SIM.
2407a96207e2ba549843e9fcbbc7f2fde7ed96ada84Tom Taylor     * <P>Type: INTEGER (int)</P>
241a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville     * @hide
2427a96207e2ba549843e9fcbbc7f2fde7ed96ada84Tom Taylor     */
2437a96207e2ba549843e9fcbbc7f2fde7ed96ada84Tom Taylor    public static final String MCC = "mcc";
2447a96207e2ba549843e9fcbbc7f2fde7ed96ada84Tom Taylor
2457a96207e2ba549843e9fcbbc7f2fde7ed96ada84Tom Taylor    /**
246905bb54108d380555dbec1c9961a675740fe6e96Wink Saville     * TelephonyProvider column name for the MNC associated with a SIM.
2477a96207e2ba549843e9fcbbc7f2fde7ed96ada84Tom Taylor     * <P>Type: INTEGER (int)</P>
248a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville     * @hide
2497a96207e2ba549843e9fcbbc7f2fde7ed96ada84Tom Taylor     */
2507a96207e2ba549843e9fcbbc7f2fde7ed96ada84Tom Taylor    public static final String MNC = "mnc";
2517a96207e2ba549843e9fcbbc7f2fde7ed96ada84Tom Taylor
252c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville    /**
253c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville     * Broadcast Action: The user has changed one of the default subs related to
254c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville     * data, phone calls, or sms</p>
255d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     *
256d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * TODO: Change to a listener
257f5bca080a231e45e1694651c012c74ba52436635Wink Saville     * @hide
258c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville     */
259c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
260c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville    public static final String SUB_DEFAULT_CHANGED_ACTION =
261c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        "android.intent.action.SUB_DEFAULT_CHANGED";
262fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
263d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    private final Context mContext;
264d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville
265d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    /**
266d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * A listener class for monitoring changes to {@link SubscriptionInfo} records.
267d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * <p>
268d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * Override the onSubscriptionsChanged method in the object that extends this
269071743f0cbbfab36150db6ec945452579d02e8ddWink Saville     * class and pass it to {@link #addOnSubscriptionsChangedListener(OnSubscriptionsChangedListener)}
270d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * to register your listener and to unregister invoke
271071743f0cbbfab36150db6ec945452579d02e8ddWink Saville     * {@link #removeOnSubscriptionsChangedListener(OnSubscriptionsChangedListener)}
272d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * <p>
273d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * Permissions android.Manifest.permission.READ_PHONE_STATE is required
274d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * for #onSubscriptionsChanged to be invoked.
275d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     */
276d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public static class OnSubscriptionsChangedListener {
277d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        /** @hide */
278d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        public static final String PERMISSION_ON_SUBSCRIPTIONS_CHANGED =
279d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville                android.Manifest.permission.READ_PHONE_STATE;
280d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville
281d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        private final Handler mHandler  = new Handler() {
282d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville            @Override
283d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville            public void handleMessage(Message msg) {
284d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville                if (DBG) {
285d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville                    log("handleMessage: invoke the overriden onSubscriptionsChanged()");
286d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville                }
287d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville                OnSubscriptionsChangedListener.this.onSubscriptionsChanged();
288d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville            }
289d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        };
290d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville
291d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        /**
292d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville         * Callback invoked when there is any change to any SubscriptionInfo. Typically
293d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville         * this method would invoke {@link #getActiveSubscriptionInfoList}
294d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville         */
295d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        public void onSubscriptionsChanged() {
296d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville            if (DBG) log("onSubscriptionsChanged: NOT OVERRIDDEN");
297d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        }
298d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville
299d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        /**
300d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville         * The callback methods need to be called on the handler thread where
301d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville         * this object was created.  If the binder did that for us it'd be nice.
302d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville         */
303d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        IOnSubscriptionsChangedListener callback = new IOnSubscriptionsChangedListener.Stub() {
304d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville            @Override
305d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville            public void onSubscriptionsChanged() {
306d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville                if (DBG) log("callback: received, sendEmptyMessage(0) to handler");
307d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville                mHandler.sendEmptyMessage(0);
308d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville            }
309d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        };
310d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville
311d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        private void log(String s) {
312d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville            Rlog.d(LOG_TAG, s);
313d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        }
314d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    }
315d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville
316f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
317d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public SubscriptionManager(Context context) {
318fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        if (DBG) logd("SubscriptionManager created");
319d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        mContext = context;
320d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    }
321d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville
322d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    /**
323d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * Get an instance of the SubscriptionManager from the Context.
324d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * This invokes {@link android.content.Context#getSystemService
325d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * Context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE)}.
326d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     *
327d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * @param context to use.
328d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * @return SubscriptionManager instance
329d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     */
330d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public static SubscriptionManager from(Context context) {
331d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        return (SubscriptionManager) context.getSystemService(
332d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville                Context.TELEPHONY_SUBSCRIPTION_SERVICE);
333fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    }
334fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
335fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    /**
336d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * Register for changes to the list of active {@link SubscriptionInfo} records or to the
337d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * individual records themselves. When a change occurs the onSubscriptionsChanged method of
338d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * the listener will be invoked immediately if there has been a notification.
339a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville     *
340d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * @param listener an instance of {@link OnSubscriptionsChangedListener} with
341d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     *                 onSubscriptionsChanged overridden.
342a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville     */
343071743f0cbbfab36150db6ec945452579d02e8ddWink Saville    public void addOnSubscriptionsChangedListener(OnSubscriptionsChangedListener listener) {
344d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        String pkgForDebug = mContext != null ? mContext.getPackageName() : "<unknown>";
345a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville        if (DBG) {
346d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville            logd("register OnSubscriptionsChangedListener pkgForDebug=" + pkgForDebug
347d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville                    + " listener=" + listener);
348a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville        }
349a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville        try {
350d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville            // We use the TelephonyRegistry as it runs in the system and thus is always
351d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville            // available. Where as SubscriptionController could crash and not be available
352a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville            ITelephonyRegistry tr = ITelephonyRegistry.Stub.asInterface(ServiceManager.getService(
353a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville                    "telephony.registry"));
354a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville            if (tr != null) {
355071743f0cbbfab36150db6ec945452579d02e8ddWink Saville                tr.addOnSubscriptionsChangedListener(pkgForDebug, listener.callback);
356a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville            }
357a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville        } catch (RemoteException ex) {
358a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville            // Should not happen
359a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville        }
360a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville    }
361a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville
362a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville    /**
363d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * Unregister the {@link OnSubscriptionsChangedListener}. This is not strictly necessary
364d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * as the listener will automatically be unregistered if an attempt to invoke the listener
365d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * fails.
366a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville     *
367d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * @param listener that is to be unregistered.
368fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     */
369071743f0cbbfab36150db6ec945452579d02e8ddWink Saville    public void removeOnSubscriptionsChangedListener(OnSubscriptionsChangedListener listener) {
370d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        String pkgForDebug = mContext != null ? mContext.getPackageName() : "<unknown>";
371a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville        if (DBG) {
372d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville            logd("unregister OnSubscriptionsChangedListener pkgForDebug=" + pkgForDebug
373a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville                    + " listener=" + listener);
374a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville        }
375a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville        try {
376a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville            // We use the TelephonyRegistry as its runs in the system and thus is always
377a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville            // available where as SubscriptionController could crash and not be available
378a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville            ITelephonyRegistry tr = ITelephonyRegistry.Stub.asInterface(ServiceManager.getService(
379a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville                    "telephony.registry"));
380a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville            if (tr != null) {
381071743f0cbbfab36150db6ec945452579d02e8ddWink Saville                tr.removeOnSubscriptionsChangedListener(pkgForDebug, listener.callback);
382a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville            }
383a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville        } catch (RemoteException ex) {
384a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville            // Should not happen
385a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville        }
386a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville    }
387a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville
388a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville    /**
389d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * Get the active SubscriptionInfo with the subId key
390d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * @param subId The unique SubscriptionInfo key in database
391d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * @return SubscriptionInfo, maybe null if its not active.
392a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville     */
393d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public SubscriptionInfo getActiveSubscriptionInfo(int subId) {
394d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        if (VDBG) logd("[getActiveSubscriptionInfo]+ subId=" + subId);
395a54bf6583380cf328b9858d942b4c387c6163f0fWink Saville        if (!isValidSubscriptionId(subId)) {
396d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville            logd("[getActiveSubscriptionInfo]- invalid subId");
397fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            return null;
398fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        }
399fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
400a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville        SubscriptionInfo subInfo = null;
401fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
402fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        try {
403fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
404fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            if (iSub != null) {
405d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville                subInfo = iSub.getActiveSubscriptionInfo(subId);
406fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            }
407fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        } catch (RemoteException ex) {
408fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            // ignore it
409fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        }
410fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
411fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        return subInfo;
412fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
413fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    }
414fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
415fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    /**
416d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * Get the active SubscriptionInfo associated with the iccId
417fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     * @param iccId the IccId of SIM card
418d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * @return SubscriptionInfo, maybe null if its not active
419f5bca080a231e45e1694651c012c74ba52436635Wink Saville     * @hide
420fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     */
421d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public SubscriptionInfo getActiveSubscriptionInfoForIccIndex(String iccId) {
422d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        if (VDBG) logd("[getActiveSubscriptionInfoForIccIndex]+ iccId=" + iccId);
423fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        if (iccId == null) {
424d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville            logd("[getActiveSubscriptionInfoForIccIndex]- null iccid");
425fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            return null;
426fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        }
427fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
428d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        SubscriptionInfo result = null;
429fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
430fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        try {
431fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
432fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            if (iSub != null) {
433d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville                result = iSub.getActiveSubscriptionInfoForIccId(iccId);
434fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            }
435fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        } catch (RemoteException ex) {
436fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            // ignore it
437fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        }
438fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
439fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        return result;
440fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    }
441fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
442fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    /**
443d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * Get the active SubscriptionInfo associated with the slotIdx
444d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * @param slotIdx the slot which the subscription is inserted
445d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * @return SubscriptionInfo, maybe null if its not active
446fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     */
447d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public SubscriptionInfo getActiveSubscriptionInfoForSimSlotIndex(int slotIdx) {
448d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        if (VDBG) logd("[getActiveSubscriptionInfoForSimSlotIndex]+ slotIdx=" + slotIdx);
449d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        if (!isValidSlotId(slotIdx)) {
450d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville            logd("[getActiveSubscriptionInfoForSimSlotIndex]- invalid slotIdx");
451fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            return null;
452fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        }
453fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
454d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        SubscriptionInfo result = null;
455fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
456fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        try {
457fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
458fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            if (iSub != null) {
459d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville                result = iSub.getActiveSubscriptionInfoForSimSlotIndex(slotIdx);
460fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            }
461fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        } catch (RemoteException ex) {
462fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            // ignore it
463fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        }
464fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
465fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        return result;
466fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    }
467fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
468fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    /**
469d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * @return List of all SubscriptionInfo records in database,
470d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * include those that were inserted before, maybe empty but not null.
471f5bca080a231e45e1694651c012c74ba52436635Wink Saville     * @hide
472fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     */
473d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public List<SubscriptionInfo> getAllSubscriptionInfoList() {
474a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville        if (VDBG) logd("[getAllSubscriptionInfoList]+");
475fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
476a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville        List<SubscriptionInfo> result = null;
477fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
478fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        try {
479fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
480fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            if (iSub != null) {
481fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville                result = iSub.getAllSubInfoList();
482fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            }
483fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        } catch (RemoteException ex) {
484fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            // ignore it
485fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        }
486fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
487905bb54108d380555dbec1c9961a675740fe6e96Wink Saville        if (result == null) {
488a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville            result = new ArrayList<SubscriptionInfo>();
489905bb54108d380555dbec1c9961a675740fe6e96Wink Saville        }
490fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        return result;
491fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    }
492fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
493fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    /**
494d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * Get the SubscriptionInfo(s) of the currently inserted SIM(s). The records will be sorted
495d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * by {@link SubscriptionInfo#getSimSlotIndex} then by {@link SubscriptionInfo#getSubscriptionId}.
496d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     *
497d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * @return Sorted list of the currently {@link SubscriptionInfo} records available on the device.
498d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * <ul>
499d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * <li>
500d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * If null is returned the current state is unknown but if a {@link OnSubscriptionsChangedListener}
501d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * has been registered {@link OnSubscriptionsChangedListener#onSubscriptionsChanged} will be
502d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * invoked in the future.
503d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * </li>
504d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * <li>
505d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * If the list is empty then there are no {@link SubscriptionInfo} records currently available.
506d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * </li>
507d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * <li>
508d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * if the list is non-empty the list is sorted by {@link SubscriptionInfo#getSimSlotIndex}
509d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * then by {@link SubscriptionInfo#getSubscriptionId}.
510d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * </li>
511d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * </ul>
512fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     */
513d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public List<SubscriptionInfo> getActiveSubscriptionInfoList() {
514a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville        List<SubscriptionInfo> result = null;
515fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
516fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        try {
517fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
518fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            if (iSub != null) {
519d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville                result = iSub.getActiveSubscriptionInfoList();
520fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            }
521fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        } catch (RemoteException ex) {
522fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            // ignore it
523fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        }
524fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        return result;
525fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    }
526fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
527fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    /**
528d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * @return the count of all subscriptions in the database, this includes
529d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * all subscriptions that have been seen.
530f5bca080a231e45e1694651c012c74ba52436635Wink Saville     * @hide
531fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     */
532d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public int getAllSubscriptionInfoCount() {
533a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville        if (VDBG) logd("[getAllSubscriptionInfoCount]+");
534fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
535fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        int result = 0;
536fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
537fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        try {
538fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
539fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            if (iSub != null) {
540fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville                result = iSub.getAllSubInfoCount();
541fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            }
542fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        } catch (RemoteException ex) {
543fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            // ignore it
544fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        }
545fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
546fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        return result;
547fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    }
548fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
549fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    /**
550d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * @return the current number of active subscriptions. There is no guarantee the value
551d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * returned by this method will be the same as the length of the list returned by
552d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * {@link #getActiveSubscriptionInfoList}.
553c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville     */
554d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public int getActiveSubscriptionInfoCount() {
555c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        int result = 0;
556c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville
557c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        try {
558c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville            ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
559c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville            if (iSub != null) {
5608a38a203a9754be85e12484adff69f7577fa4fadWink Saville                result = iSub.getActiveSubInfoCount();
561c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville            }
562c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        } catch (RemoteException ex) {
563c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville            // ignore it
564c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        }
565c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville
566c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        return result;
567c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville    }
568c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville
569c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville    /**
570d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * @return the maximum number of active subscriptions that will be returned by
571d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * {@link #getActiveSubscriptionInfoList} and the value returned by
572d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * {@link #getActiveSubscriptionInfoCount}.
573d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     */
574d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public int getActiveSubscriptionInfoCountMax() {
575d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        int result = 0;
576d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville
577d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        try {
578d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville            ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
579d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville            if (iSub != null) {
580d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville                result = iSub.getActiveSubInfoCountMax();
581d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville            }
582d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        } catch (RemoteException ex) {
583d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville            // ignore it
584d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        }
585d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville
586d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        return result;
587d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    }
588d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville
589d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    /**
590d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * Add a new SubscriptionInfo to SubscriptionInfo database if needed
591fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     * @param iccId the IccId of the SIM card
592fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     * @param slotId the slot which the SIM is inserted
593fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     * @return the URL of the newly created row or the updated row
594f5bca080a231e45e1694651c012c74ba52436635Wink Saville     * @hide
595fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     */
596d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public Uri addSubscriptionInfoRecord(String iccId, int slotId) {
597a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville        if (VDBG) logd("[addSubscriptionInfoRecord]+ iccId:" + iccId + " slotId:" + slotId);
598fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        if (iccId == null) {
599a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville            logd("[addSubscriptionInfoRecord]- null iccId");
600fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        }
601c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        if (!isValidSlotId(slotId)) {
602a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville            logd("[addSubscriptionInfoRecord]- invalid slotId");
603c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        }
604fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
605fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        try {
606fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
607fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            if (iSub != null) {
608fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville                // FIXME: This returns 1 on success, 0 on error should should we return it?
609fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville                iSub.addSubInfoRecord(iccId, slotId);
610fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            }
611fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        } catch (RemoteException ex) {
612fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            // ignore it
613fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        }
614fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
615fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        // FIXME: Always returns null?
616fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        return null;
617fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
618fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    }
619fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
620fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    /**
621ab45ec177a787fee046f6a9c4d1098d529aff7bbStuart Scott     * Set SIM icon tint color by simInfo index
622d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * @param tint the RGB value of icon tint color of the SIM
623fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     * @param subId the unique SubInfoRecord index in database
624fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     * @return the number of records updated
625f5bca080a231e45e1694651c012c74ba52436635Wink Saville     * @hide
626fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     */
627d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public int setIconTint(int tint, int subId) {
628ab45ec177a787fee046f6a9c4d1098d529aff7bbStuart Scott        if (VDBG) logd("[setIconTint]+ tint:" + tint + " subId:" + subId);
629a54bf6583380cf328b9858d942b4c387c6163f0fWink Saville        if (!isValidSubscriptionId(subId)) {
630ab45ec177a787fee046f6a9c4d1098d529aff7bbStuart Scott            logd("[setIconTint]- fail");
631fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            return -1;
632fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        }
633fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
634fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        int result = 0;
635fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
636fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        try {
637fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
638fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            if (iSub != null) {
639ab45ec177a787fee046f6a9c4d1098d529aff7bbStuart Scott                result = iSub.setIconTint(tint, subId);
640fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            }
641fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        } catch (RemoteException ex) {
642fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            // ignore it
643fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        }
644fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
645fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        return result;
646fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
647fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    }
648fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
649fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    /**
650fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     * Set display name by simInfo index
651fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     * @param displayName the display name of SIM card
652a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville     * @param subId the unique SubscriptionInfo index in database
653fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     * @return the number of records updated
654f5bca080a231e45e1694651c012c74ba52436635Wink Saville     * @hide
655fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     */
656d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public int setDisplayName(String displayName, int subId) {
657c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        return setDisplayName(displayName, subId, NAME_SOURCE_UNDEFINDED);
658fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    }
659fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
660fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    /**
661fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     * Set display name by simInfo index with name source
662fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     * @param displayName the display name of SIM card
663a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville     * @param subId the unique SubscriptionInfo index in database
664c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville     * @param nameSource 0: NAME_SOURCE_DEFAULT_SOURCE, 1: NAME_SOURCE_SIM_SOURCE,
665c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville     *                   2: NAME_SOURCE_USER_INPUT, -1 NAME_SOURCE_UNDEFINED
66698513d7bd44fe9ce14733c8162544c2114f8f21bWink Saville     * @return the number of records updated or < 0 if invalid subId
667f5bca080a231e45e1694651c012c74ba52436635Wink Saville     * @hide
668fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     */
669d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public int setDisplayName(String displayName, int subId, long nameSource) {
670c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        if (VDBG) {
671c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville            logd("[setDisplayName]+  displayName:" + displayName + " subId:" + subId
672c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville                    + " nameSource:" + nameSource);
673c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        }
674a54bf6583380cf328b9858d942b4c387c6163f0fWink Saville        if (!isValidSubscriptionId(subId)) {
675fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            logd("[setDisplayName]- fail");
676fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            return -1;
677fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        }
678fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
679fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        int result = 0;
680fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
681fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        try {
682fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
683fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            if (iSub != null) {
684fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville                result = iSub.setDisplayNameUsingSrc(displayName, subId, nameSource);
685fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            }
686fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        } catch (RemoteException ex) {
687fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            // ignore it
688fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        }
689fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
690fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        return result;
691fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
692fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    }
693fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
694fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    /**
695fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     * Set phone number by subId
696fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     * @param number the phone number of the SIM
697a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville     * @param subId the unique SubscriptionInfo index in database
698fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     * @return the number of records updated
699f5bca080a231e45e1694651c012c74ba52436635Wink Saville     * @hide
700fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     */
701d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public int setDisplayNumber(String number, int subId) {
702a54bf6583380cf328b9858d942b4c387c6163f0fWink Saville        if (number == null || !isValidSubscriptionId(subId)) {
703c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville            logd("[setDisplayNumber]- fail");
704fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            return -1;
705fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        }
706fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
707fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        int result = 0;
708fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
709fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        try {
710fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
711fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            if (iSub != null) {
712c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville                result = iSub.setDisplayNumber(number, subId);
713fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            }
714fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        } catch (RemoteException ex) {
715fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            // ignore it
716fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        }
717fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
718fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        return result;
719fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
720fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    }
721fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
722fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    /**
723fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     * Set data roaming by simInfo index
724fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     * @param roaming 0:Don't allow data when roaming, 1:Allow data when roaming
725a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville     * @param subId the unique SubscriptionInfo index in database
726fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     * @return the number of records updated
727f5bca080a231e45e1694651c012c74ba52436635Wink Saville     * @hide
728fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     */
729d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public int setDataRoaming(int roaming, int subId) {
730fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        if (VDBG) logd("[setDataRoaming]+ roaming:" + roaming + " subId:" + subId);
731a54bf6583380cf328b9858d942b4c387c6163f0fWink Saville        if (roaming < 0 || !isValidSubscriptionId(subId)) {
732fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            logd("[setDataRoaming]- fail");
733fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            return -1;
734fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        }
735fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
736fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        int result = 0;
737fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
738fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        try {
739fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
740fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            if (iSub != null) {
741fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville                result = iSub.setDataRoaming(roaming, subId);
742fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            }
743fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        } catch (RemoteException ex) {
744fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            // ignore it
745fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        }
746fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
747fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        return result;
748fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    }
749fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
750905bb54108d380555dbec1c9961a675740fe6e96Wink Saville    /**
751905bb54108d380555dbec1c9961a675740fe6e96Wink Saville     * Get slotId associated with the subscription.
752905bb54108d380555dbec1c9961a675740fe6e96Wink Saville     * @return slotId as a positive integer or a negative value if an error either
75398513d7bd44fe9ce14733c8162544c2114f8f21bWink Saville     * SIM_NOT_INSERTED or < 0 if an invalid slot index
754a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville     * @hide
755905bb54108d380555dbec1c9961a675740fe6e96Wink Saville     */
75663f03dd94c43c22f2c77306059b5748e5e1e0e3cWink Saville    public static int getSlotId(int subId) {
757a54bf6583380cf328b9858d942b4c387c6163f0fWink Saville        if (!isValidSubscriptionId(subId)) {
758c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville            logd("[getSlotId]- fail");
759c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        }
760fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
761d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        int result = INVALID_SIM_SLOT_INDEX;
762fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
763fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        try {
764fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
765fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            if (iSub != null) {
766fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville                result = iSub.getSlotId(subId);
767fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            }
768fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        } catch (RemoteException ex) {
769fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            // ignore it
770fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        }
771fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
772fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        return result;
773fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
774fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    }
775fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
776f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
77763f03dd94c43c22f2c77306059b5748e5e1e0e3cWink Saville    public static int[] getSubId(int slotId) {
778c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        if (!isValidSlotId(slotId)) {
779c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville            logd("[getSubId]- fail");
780c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville            return null;
781c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        }
782fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
78363f03dd94c43c22f2c77306059b5748e5e1e0e3cWink Saville        int[] subId = null;
784fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
785fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        try {
786fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
787fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            if (iSub != null) {
788fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville                subId = iSub.getSubId(slotId);
789fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            }
790fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        } catch (RemoteException ex) {
791fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            // ignore it
792fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        }
793fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
794fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        return subId;
795fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    }
796fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
797f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
79863f03dd94c43c22f2c77306059b5748e5e1e0e3cWink Saville    public static int getPhoneId(int subId) {
799a54bf6583380cf328b9858d942b4c387c6163f0fWink Saville        if (!isValidSubscriptionId(subId)) {
800c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville            logd("[getPhoneId]- fail");
801d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville            return INVALID_PHONE_INDEX;
802c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        }
803fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
804d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        int result = INVALID_PHONE_INDEX;
805fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
806fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        try {
807fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
808fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            if (iSub != null) {
809fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville                result = iSub.getPhoneId(subId);
810fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            }
811fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        } catch (RemoteException ex) {
812fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            // ignore it
813fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        }
814fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
815c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        if (VDBG) logd("[getPhoneId]- phoneId=" + result);
816fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        return result;
817fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
818fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    }
819fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
820fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    private static void logd(String msg) {
821d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        Rlog.d(LOG_TAG, msg);
822fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    }
823fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
824fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    /**
825fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     * @return the "system" defaultSubId on a voice capable device this
826fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     * will be getDefaultVoiceSubId() and on a data only device it will be
827fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     * getDefaultDataSubId().
828f5bca080a231e45e1694651c012c74ba52436635Wink Saville     * @hide
829fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville     */
83063f03dd94c43c22f2c77306059b5748e5e1e0e3cWink Saville    public static int getDefaultSubId() {
831d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        int subId = INVALID_SUBSCRIPTION_ID;
832fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
833fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        try {
834fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
835fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            if (iSub != null) {
836fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville                subId = iSub.getDefaultSubId();
837fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            }
838fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        } catch (RemoteException ex) {
839fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            // ignore it
840fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        }
841fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
842fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        if (VDBG) logd("getDefaultSubId=" + subId);
843fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        return subId;
844fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    }
845fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
846f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
84763f03dd94c43c22f2c77306059b5748e5e1e0e3cWink Saville    public static int getDefaultVoiceSubId() {
848d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        int subId = INVALID_SUBSCRIPTION_ID;
849fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
850fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        try {
851fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
852fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            if (iSub != null) {
853fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville                subId = iSub.getDefaultVoiceSubId();
854fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            }
855fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        } catch (RemoteException ex) {
856fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            // ignore it
857fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        }
858fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
859c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        if (VDBG) logd("getDefaultVoiceSubId, sub id = " + subId);
860fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        return subId;
861fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    }
862fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
863f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
864d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public void setDefaultVoiceSubId(int subId) {
865fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        if (VDBG) logd("setDefaultVoiceSubId sub id = " + subId);
866fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        try {
867fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
868fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            if (iSub != null) {
869fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville                iSub.setDefaultVoiceSubId(subId);
870fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            }
871fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        } catch (RemoteException ex) {
872c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville            // ignore it
873c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        }
874c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville    }
875c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville
876f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
877d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public SubscriptionInfo getDefaultVoiceSubscriptionInfo() {
878d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        return getActiveSubscriptionInfo(getDefaultVoiceSubId());
879c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville    }
880c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville
881f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
882c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville    public static int getDefaultVoicePhoneId() {
883c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        return getPhoneId(getDefaultVoiceSubId());
884c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville    }
885c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville
886905bb54108d380555dbec1c9961a675740fe6e96Wink Saville    /**
887d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * @return subId of the DefaultSms subscription or
88898513d7bd44fe9ce14733c8162544c2114f8f21bWink Saville     * a value < 0 if an error.
889d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     *
890a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville     * @hide
891905bb54108d380555dbec1c9961a675740fe6e96Wink Saville     */
89263f03dd94c43c22f2c77306059b5748e5e1e0e3cWink Saville    public static int getDefaultSmsSubId() {
893d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        int subId = INVALID_SUBSCRIPTION_ID;
894c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville
895c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        try {
896c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville            ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
897c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville            if (iSub != null) {
898c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville                subId = iSub.getDefaultSmsSubId();
899c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville            }
900c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        } catch (RemoteException ex) {
901c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville            // ignore it
902c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        }
903c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville
904c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        if (VDBG) logd("getDefaultSmsSubId, sub id = " + subId);
905c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        return subId;
906c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville    }
907c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville
908f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
909d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public void setDefaultSmsSubId(int subId) {
910c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        if (VDBG) logd("setDefaultSmsSubId sub id = " + subId);
911c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        try {
912c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville            ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
913c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville            if (iSub != null) {
914c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville                iSub.setDefaultSmsSubId(subId);
915c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville            }
916c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        } catch (RemoteException ex) {
917c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville            // ignore it
918fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        }
919fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    }
920fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
921f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
922d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public SubscriptionInfo getDefaultSmsSubscriptionInfo() {
923d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        return getActiveSubscriptionInfo(getDefaultSmsSubId());
924fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    }
925fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
926f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
927d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public int getDefaultSmsPhoneId() {
928c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        return getPhoneId(getDefaultSmsSubId());
929fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    }
930fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
931f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
93263f03dd94c43c22f2c77306059b5748e5e1e0e3cWink Saville    public static int getDefaultDataSubId() {
933d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        int subId = INVALID_SUBSCRIPTION_ID;
934fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
935fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        try {
936fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
937fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            if (iSub != null) {
938c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville                subId = iSub.getDefaultDataSubId();
939fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            }
940fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        } catch (RemoteException ex) {
941c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville            // ignore it
942fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        }
943c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville
944c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        if (VDBG) logd("getDefaultDataSubId, sub id = " + subId);
945c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        return subId;
946fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    }
947fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
948f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
949d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public void setDefaultDataSubId(int subId) {
950fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        if (VDBG) logd("setDataSubscription sub id = " + subId);
951fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        try {
952fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
953fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            if (iSub != null) {
954fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville                iSub.setDefaultDataSubId(subId);
955fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            }
956fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        } catch (RemoteException ex) {
957c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville            // ignore it
958fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        }
959fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    }
960fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
961f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
962d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public SubscriptionInfo getDefaultDataSubscriptionInfo() {
963d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        return getActiveSubscriptionInfo(getDefaultDataSubId());
964c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville    }
965fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
966f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
967d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public int getDefaultDataPhoneId() {
968c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        return getPhoneId(getDefaultDataSubId());
969c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville    }
970c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville
971f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
972d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public void clearSubscriptionInfo() {
973fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        try {
974fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
975fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            if (iSub != null) {
976fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville                iSub.clearSubInfo();
977fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            }
978fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        } catch (RemoteException ex) {
979fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            // ignore it
980fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        }
981fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
982fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        return;
983fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    }
984fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
985c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville    //FIXME this is vulnerable to race conditions
986f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
987d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public boolean allDefaultsSelected() {
988a54bf6583380cf328b9858d942b4c387c6163f0fWink Saville        if (!isValidSubscriptionId(getDefaultDataSubId())) {
989c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville            return false;
990c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        }
991a54bf6583380cf328b9858d942b4c387c6163f0fWink Saville        if (!isValidSubscriptionId(getDefaultSmsSubId())) {
992c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville            return false;
993c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        }
994a54bf6583380cf328b9858d942b4c387c6163f0fWink Saville        if (!isValidSubscriptionId(getDefaultVoiceSubId())) {
995c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville            return false;
996c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        }
997c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        return true;
998c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville    }
999c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville
1000c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville    /**
1001c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville     * If a default is set to subscription which is not active, this will reset that default back to
100298513d7bd44fe9ce14733c8162544c2114f8f21bWink Saville     * an invalid subscription id, i.e. < 0.
1003f5bca080a231e45e1694651c012c74ba52436635Wink Saville     * @hide
1004c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville     */
1005d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public void clearDefaultsForInactiveSubIds() {
1006c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        if (VDBG) logd("clearDefaultsForInactiveSubIds");
1007c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        try {
1008c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville            ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
1009c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville            if (iSub != null) {
1010c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville                iSub.clearDefaultsForInactiveSubIds();
1011c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville            }
1012c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        } catch (RemoteException ex) {
1013c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville            // ignore it
1014c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        }
1015c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville    }
1016c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville
1017905bb54108d380555dbec1c9961a675740fe6e96Wink Saville    /**
1018905bb54108d380555dbec1c9961a675740fe6e96Wink Saville     * @return true if a valid subId else false
1019a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville     * @hide
1020905bb54108d380555dbec1c9961a675740fe6e96Wink Saville     */
1021a54bf6583380cf328b9858d942b4c387c6163f0fWink Saville    public static boolean isValidSubscriptionId(int subId) {
1022d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        return subId > INVALID_SUBSCRIPTION_ID ;
1023c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville    }
1024c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville
10258eab2b6bdffc3a5934796d074f541f1020b26f30Wink Saville    /**
10268eab2b6bdffc3a5934796d074f541f1020b26f30Wink Saville     * @return true if subId is an usable subId value else false. A
102798513d7bd44fe9ce14733c8162544c2114f8f21bWink Saville     * usable subId means its neither a INVALID_SUBSCRIPTION_ID nor a DEFAULT_SUB_ID.
10288eab2b6bdffc3a5934796d074f541f1020b26f30Wink Saville     * @hide
10298eab2b6bdffc3a5934796d074f541f1020b26f30Wink Saville     */
103063f03dd94c43c22f2c77306059b5748e5e1e0e3cWink Saville    public static boolean isUsableSubIdValue(int subId) {
1031d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        return subId >= MIN_SUBSCRIPTION_ID_VALUE && subId <= MAX_SUBSCRIPTION_ID_VALUE;
10328eab2b6bdffc3a5934796d074f541f1020b26f30Wink Saville    }
10338eab2b6bdffc3a5934796d074f541f1020b26f30Wink Saville
1034f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
1035c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville    public static boolean isValidSlotId(int slotId) {
1036d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        return slotId >= 0 && slotId < TelephonyManager.getDefault().getSimCount();
1037c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville    }
1038c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville
1039f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
1040c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville    public static boolean isValidPhoneId(int phoneId) {
1041d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        return phoneId >= 0 && phoneId < TelephonyManager.getDefault().getPhoneCount();
1042c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville    }
1043c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville
1044f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
1045fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    public static void putPhoneIdAndSubIdExtra(Intent intent, int phoneId) {
104663f03dd94c43c22f2c77306059b5748e5e1e0e3cWink Saville        int[] subIds = SubscriptionManager.getSubId(phoneId);
1047c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        if (subIds != null && subIds.length > 0) {
1048c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville            putPhoneIdAndSubIdExtra(intent, phoneId, subIds[0]);
1049fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        } else {
1050fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville            logd("putPhoneIdAndSubIdExtra: no valid subs");
1051fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville        }
1052fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville    }
1053eeacf9374748a5f7fc96a1beaf18c353d473d752Wink Saville
1054f5bca080a231e45e1694651c012c74ba52436635Wink Saville    /** @hide */
105563f03dd94c43c22f2c77306059b5748e5e1e0e3cWink Saville    public static void putPhoneIdAndSubIdExtra(Intent intent, int phoneId, int subId) {
1056eeacf9374748a5f7fc96a1beaf18c353d473d752Wink Saville        if (VDBG) logd("putPhoneIdAndSubIdExtra: phoneId=" + phoneId + " subId=" + subId);
1057eeacf9374748a5f7fc96a1beaf18c353d473d752Wink Saville        intent.putExtra(PhoneConstants.SUBSCRIPTION_KEY, subId);
1058c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        intent.putExtra(PhoneConstants.PHONE_KEY, phoneId);
1059c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        //FIXME this is using phoneId and slotId interchangeably
1060c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        //Eventually, this should be removed as it is not the slot id
1061c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        intent.putExtra(PhoneConstants.SLOT_KEY, phoneId);
1062c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville    }
1063c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville
1064c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville    /**
10658a38a203a9754be85e12484adff69f7577fa4fadWink Saville     * @return the list of subId's that are active,
1066c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville     *         is never null but the length maybe 0.
1067f5bca080a231e45e1694651c012c74ba52436635Wink Saville     * @hide
1068c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville     */
10693256601f5e4d94713f59e97b9d4912875c1bdcafJeff Sharkey    public @NonNull int[] getActiveSubscriptionIdList() {
107063f03dd94c43c22f2c77306059b5748e5e1e0e3cWink Saville        int[] subId = null;
1071c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville
1072c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        try {
1073c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville            ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
1074c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville            if (iSub != null) {
10758a38a203a9754be85e12484adff69f7577fa4fadWink Saville                subId = iSub.getActiveSubIdList();
1076c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville            }
1077c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        } catch (RemoteException ex) {
1078c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville            // ignore it
1079c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        }
1080c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville
1081c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        if (subId == null) {
108263f03dd94c43c22f2c77306059b5748e5e1e0e3cWink Saville            subId = new int[0];
1083c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        }
1084c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville
1085c650e0b12a656060de767d91d99f6b33e51c6ab2Wink Saville        return subId;
10862d1ee982276f5dbd0e035778b731b48e4ef34515Wink Saville
1087eeacf9374748a5f7fc96a1beaf18c353d473d752Wink Saville    }
1088d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville
1089d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    /**
1090d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * Returns true if the device is considered roaming on the current
1091d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * network for a subscription.
1092d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * <p>
1093d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * Availability: Only when user registered to a network.
1094d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     *
1095d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * @param subId The subscription ID
1096d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     * @return true if the network for the subscription is roaming, false otherwise
1097d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville     */
1098d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    public boolean isNetworkRoaming(int subId) {
1099d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        final int phoneId = getPhoneId(subId);
1100d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        if (phoneId < 0) {
1101d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville            // What else can we do?
1102d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville            return false;
1103d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville        }
110485973dcf8cd7d7a964ba746875a0c572685d1807Legler Wu        return TelephonyManager.getDefault().isNetworkRoaming(subId);
1105d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville    }
110647920fac33efb7ce4bf33a5691e4af1b67ab6019Wink Saville
110747920fac33efb7ce4bf33a5691e4af1b67ab6019Wink Saville    /**
110847920fac33efb7ce4bf33a5691e4af1b67ab6019Wink Saville     * Returns a constant indicating the state of sim for the subscription.
110947920fac33efb7ce4bf33a5691e4af1b67ab6019Wink Saville     *
111047920fac33efb7ce4bf33a5691e4af1b67ab6019Wink Saville     * @param subId
111147920fac33efb7ce4bf33a5691e4af1b67ab6019Wink Saville     *
111247920fac33efb7ce4bf33a5691e4af1b67ab6019Wink Saville     * {@See TelephonyManager#SIM_STATE_UNKNOWN}
111347920fac33efb7ce4bf33a5691e4af1b67ab6019Wink Saville     * {@See TelephonyManager#SIM_STATE_ABSENT}
111447920fac33efb7ce4bf33a5691e4af1b67ab6019Wink Saville     * {@See TelephonyManager#SIM_STATE_PIN_REQUIRED}
111547920fac33efb7ce4bf33a5691e4af1b67ab6019Wink Saville     * {@See TelephonyManager#SIM_STATE_PUK_REQUIRED}
111647920fac33efb7ce4bf33a5691e4af1b67ab6019Wink Saville     * {@See TelephonyManager#SIM_STATE_NETWORK_LOCKED}
111747920fac33efb7ce4bf33a5691e4af1b67ab6019Wink Saville     * {@See TelephonyManager#SIM_STATE_READY}
111847920fac33efb7ce4bf33a5691e4af1b67ab6019Wink Saville     * {@See TelephonyManager#SIM_STATE_NOT_READY}
111947920fac33efb7ce4bf33a5691e4af1b67ab6019Wink Saville     * {@See TelephonyManager#SIM_STATE_PERM_DISABLED}
112047920fac33efb7ce4bf33a5691e4af1b67ab6019Wink Saville     * {@See TelephonyManager#SIM_STATE_CARD_IO_ERROR}
112147920fac33efb7ce4bf33a5691e4af1b67ab6019Wink Saville     *
112247920fac33efb7ce4bf33a5691e4af1b67ab6019Wink Saville     * {@hide}
112347920fac33efb7ce4bf33a5691e4af1b67ab6019Wink Saville     */
112447920fac33efb7ce4bf33a5691e4af1b67ab6019Wink Saville    public static int getSimStateForSubscriber(int subId) {
112547920fac33efb7ce4bf33a5691e4af1b67ab6019Wink Saville        int simState;
112647920fac33efb7ce4bf33a5691e4af1b67ab6019Wink Saville
112747920fac33efb7ce4bf33a5691e4af1b67ab6019Wink Saville        try {
112847920fac33efb7ce4bf33a5691e4af1b67ab6019Wink Saville            ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
112947920fac33efb7ce4bf33a5691e4af1b67ab6019Wink Saville            simState = iSub.getSimStateForSubscriber(subId);
113047920fac33efb7ce4bf33a5691e4af1b67ab6019Wink Saville        } catch (RemoteException ex) {
113147920fac33efb7ce4bf33a5691e4af1b67ab6019Wink Saville            simState = TelephonyManager.SIM_STATE_UNKNOWN;
113247920fac33efb7ce4bf33a5691e4af1b67ab6019Wink Saville        }
113347920fac33efb7ce4bf33a5691e4af1b67ab6019Wink Saville        logd("getSimStateForSubscriber: simState=" + simState + " subId=" + subId);
113447920fac33efb7ce4bf33a5691e4af1b67ab6019Wink Saville        return simState;
113547920fac33efb7ce4bf33a5691e4af1b67ab6019Wink Saville    }
1136fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville}
1137fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville
1138