1/*
2 * Copyright (C) 2006 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.internal.telephony.uicc;
18
19import android.telephony.Rlog;
20
21import com.android.internal.telephony.uicc.IccCardStatus.PinState;
22
23
24/**
25 * See also RIL_AppStatus in include/telephony/ril.h
26 *
27 * {@hide}
28 */
29public class IccCardApplicationStatus {
30    // TODO: Replace with constants from PhoneConstants.APPTYPE_xxx
31    public enum AppType{
32        APPTYPE_UNKNOWN,
33        APPTYPE_SIM,
34        APPTYPE_USIM,
35        APPTYPE_RUIM,
36        APPTYPE_CSIM,
37        APPTYPE_ISIM
38    }
39
40    public enum AppState{
41        APPSTATE_UNKNOWN,
42        APPSTATE_DETECTED,
43        APPSTATE_PIN,
44        APPSTATE_PUK,
45        APPSTATE_SUBSCRIPTION_PERSO,
46        APPSTATE_READY;
47
48        boolean isPinRequired() {
49            return this == APPSTATE_PIN;
50        }
51
52        boolean isPukRequired() {
53            return this == APPSTATE_PUK;
54        }
55
56        boolean isSubscriptionPersoEnabled() {
57            return this == APPSTATE_SUBSCRIPTION_PERSO;
58        }
59
60        boolean isAppReady() {
61            return this == APPSTATE_READY;
62        }
63
64        boolean isAppNotReady() {
65            return this == APPSTATE_UNKNOWN  ||
66                   this == APPSTATE_DETECTED;
67        }
68    }
69
70    public enum PersoSubState{
71        PERSOSUBSTATE_UNKNOWN,
72        PERSOSUBSTATE_IN_PROGRESS,
73        PERSOSUBSTATE_READY,
74        PERSOSUBSTATE_SIM_NETWORK,
75        PERSOSUBSTATE_SIM_NETWORK_SUBSET,
76        PERSOSUBSTATE_SIM_CORPORATE,
77        PERSOSUBSTATE_SIM_SERVICE_PROVIDER,
78        PERSOSUBSTATE_SIM_SIM,
79        PERSOSUBSTATE_SIM_NETWORK_PUK,
80        PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK,
81        PERSOSUBSTATE_SIM_CORPORATE_PUK,
82        PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK,
83        PERSOSUBSTATE_SIM_SIM_PUK,
84        PERSOSUBSTATE_RUIM_NETWORK1,
85        PERSOSUBSTATE_RUIM_NETWORK2,
86        PERSOSUBSTATE_RUIM_HRPD,
87        PERSOSUBSTATE_RUIM_CORPORATE,
88        PERSOSUBSTATE_RUIM_SERVICE_PROVIDER,
89        PERSOSUBSTATE_RUIM_RUIM,
90        PERSOSUBSTATE_RUIM_NETWORK1_PUK,
91        PERSOSUBSTATE_RUIM_NETWORK2_PUK,
92        PERSOSUBSTATE_RUIM_HRPD_PUK,
93        PERSOSUBSTATE_RUIM_CORPORATE_PUK,
94        PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK,
95        PERSOSUBSTATE_RUIM_RUIM_PUK;
96
97        boolean isPersoSubStateUnknown() {
98            return this == PERSOSUBSTATE_UNKNOWN;
99        }
100    }
101
102    public AppType        app_type;
103    public AppState       app_state;
104    // applicable only if app_state == RIL_APPSTATE_SUBSCRIPTION_PERSO
105    public PersoSubState  perso_substate;
106    // null terminated string, e.g., from 0xA0, 0x00 -> 0x41, 0x30, 0x30, 0x30 */
107    public String         aid;
108    // null terminated string
109    public String         app_label;
110    // applicable to USIM and CSIM
111    public int            pin1_replaced;
112    public PinState       pin1;
113    public PinState       pin2;
114
115    public AppType AppTypeFromRILInt(int type) {
116        AppType newType;
117        /* RIL_AppType ril.h */
118        switch(type) {
119            case 0: newType = AppType.APPTYPE_UNKNOWN; break;
120            case 1: newType = AppType.APPTYPE_SIM;     break;
121            case 2: newType = AppType.APPTYPE_USIM;    break;
122            case 3: newType = AppType.APPTYPE_RUIM;    break;
123            case 4: newType = AppType.APPTYPE_CSIM;    break;
124            case 5: newType = AppType.APPTYPE_ISIM;    break;
125            default:
126                newType = AppType.APPTYPE_UNKNOWN;
127                loge("AppTypeFromRILInt: bad RIL_AppType: " + type + " use APPTYPE_UNKNOWN");
128        }
129        return newType;
130    }
131
132    public AppState AppStateFromRILInt(int state) {
133        AppState newState;
134        /* RIL_AppState ril.h */
135        switch(state) {
136            case 0: newState = AppState.APPSTATE_UNKNOWN;  break;
137            case 1: newState = AppState.APPSTATE_DETECTED; break;
138            case 2: newState = AppState.APPSTATE_PIN; break;
139            case 3: newState = AppState.APPSTATE_PUK; break;
140            case 4: newState = AppState.APPSTATE_SUBSCRIPTION_PERSO; break;
141            case 5: newState = AppState.APPSTATE_READY; break;
142            default:
143                newState = AppState.APPSTATE_UNKNOWN;
144                loge("AppStateFromRILInt: bad state: " + state + " use APPSTATE_UNKNOWN");
145        }
146        return newState;
147    }
148
149    public PersoSubState PersoSubstateFromRILInt(int substate) {
150        PersoSubState newSubState;
151        /* RIL_PeroSubstate ril.h */
152        switch(substate) {
153            case 0:  newSubState = PersoSubState.PERSOSUBSTATE_UNKNOWN;  break;
154            case 1:  newSubState = PersoSubState.PERSOSUBSTATE_IN_PROGRESS; break;
155            case 2:  newSubState = PersoSubState.PERSOSUBSTATE_READY; break;
156            case 3:  newSubState = PersoSubState.PERSOSUBSTATE_SIM_NETWORK; break;
157            case 4:  newSubState = PersoSubState.PERSOSUBSTATE_SIM_NETWORK_SUBSET; break;
158            case 5:  newSubState = PersoSubState.PERSOSUBSTATE_SIM_CORPORATE; break;
159            case 6:  newSubState = PersoSubState.PERSOSUBSTATE_SIM_SERVICE_PROVIDER; break;
160            case 7:  newSubState = PersoSubState.PERSOSUBSTATE_SIM_SIM;  break;
161            case 8:  newSubState = PersoSubState.PERSOSUBSTATE_SIM_NETWORK_PUK; break;
162            case 9:  newSubState = PersoSubState.PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK; break;
163            case 10: newSubState = PersoSubState.PERSOSUBSTATE_SIM_CORPORATE_PUK; break;
164            case 11: newSubState = PersoSubState.PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK; break;
165            case 12: newSubState = PersoSubState.PERSOSUBSTATE_SIM_SIM_PUK; break;
166            case 13: newSubState = PersoSubState.PERSOSUBSTATE_RUIM_NETWORK1; break;
167            case 14: newSubState = PersoSubState.PERSOSUBSTATE_RUIM_NETWORK2; break;
168            case 15: newSubState = PersoSubState.PERSOSUBSTATE_RUIM_HRPD; break;
169            case 16: newSubState = PersoSubState.PERSOSUBSTATE_RUIM_CORPORATE; break;
170            case 17: newSubState = PersoSubState.PERSOSUBSTATE_RUIM_SERVICE_PROVIDER; break;
171            case 18: newSubState = PersoSubState.PERSOSUBSTATE_RUIM_RUIM; break;
172            case 19: newSubState = PersoSubState.PERSOSUBSTATE_RUIM_NETWORK1_PUK; break;
173            case 20: newSubState = PersoSubState.PERSOSUBSTATE_RUIM_NETWORK2_PUK; break;
174            case 21: newSubState = PersoSubState.PERSOSUBSTATE_RUIM_HRPD_PUK ; break;
175            case 22: newSubState = PersoSubState.PERSOSUBSTATE_RUIM_CORPORATE_PUK; break;
176            case 23: newSubState = PersoSubState.PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK; break;
177            case 24: newSubState = PersoSubState.PERSOSUBSTATE_RUIM_RUIM_PUK; break;
178            default:
179                newSubState = PersoSubState.PERSOSUBSTATE_UNKNOWN;
180                loge("PersoSubstateFromRILInt: bad substate: " + substate
181                        + " use PERSOSUBSTATE_UNKNOWN");
182        }
183        return newSubState;
184    }
185
186    public PinState PinStateFromRILInt(int state) {
187        PinState newPinState;
188        switch(state) {
189            case 0:
190                newPinState = PinState.PINSTATE_UNKNOWN;
191                break;
192            case 1:
193                newPinState = PinState.PINSTATE_ENABLED_NOT_VERIFIED;
194                break;
195            case 2:
196                newPinState = PinState.PINSTATE_ENABLED_VERIFIED;
197                break;
198            case 3:
199                newPinState = PinState.PINSTATE_DISABLED;
200                break;
201            case 4:
202                newPinState = PinState.PINSTATE_ENABLED_BLOCKED;
203                break;
204            case 5:
205                newPinState = PinState.PINSTATE_ENABLED_PERM_BLOCKED;
206                break;
207            default:
208                newPinState = PinState.PINSTATE_UNKNOWN;
209                loge("PinStateFromRILInt: bad pin state: " + state + " use PINSTATE_UNKNOWN");
210        }
211        return newPinState;
212    }
213
214    @Override
215    public String toString() {
216        StringBuilder sb = new StringBuilder();
217
218        sb.append("{").append(app_type).append(",").append(app_state);
219        if (app_state == AppState.APPSTATE_SUBSCRIPTION_PERSO) {
220            sb.append(",").append(perso_substate);
221        }
222        if (app_type == AppType.APPTYPE_CSIM ||
223                app_type == AppType.APPTYPE_USIM ||
224                app_type == AppType.APPTYPE_ISIM) {
225            sb.append(",pin1=").append(pin1);
226            sb.append(",pin2=").append(pin2);
227        }
228        sb.append("}");
229        return sb.toString();
230    }
231
232    private void loge(String s) {
233        Rlog.e("IccCardApplicationStatus", s);
234    }
235}
236