-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.html
329 lines (275 loc) · 14.6 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SDK Android para SuiteEtecsa</title>
</head>
<body>
<h1>SDK Android para SuiteEtecsa</h1>
<p><a href="https://jitpack.io/v/suitetecsa/sdk-android.svg"><img src="https://jitpack.io/v/suitetecsa/sdk-android.svg" alt="Estado de la versión en JitPack"></a></p>
<p>Esta es una librería que facilita la creación de aplicaciones Android dedicadas a gestionar los servicios de <a href="https://www.etecsa.cu">ETECSA</a>.</p>
<h2>Cómo usar</h2>
<p>Agrega la dependencia a tu archivo build.gradle/.kts:</p>
<pre><code>implementation("com.github.suitetecsa.sdk-android:{última-versión}")
</code></pre>
<h3>Obtener información de las tarjetas SIM</h3>
<p>Para obtener información sobre las tarjetas SIM insertadas en el dispositivo, puedes seguir estos pasos:</p>
<h4>Kotlin</h4>
<pre><code>// Instancia SimCardsAPI
val simCardsAPI = SimCardsAPI
.Builder(context)
.build()
// Obtiene las tarjetas SIM insertadas en el dispositivo
val simCards = simCardsAPI.getSimCards()
</code></pre>
<h4>Java</h4>
<pre><code>// Instancia SimCardsAPI
SimCardsAPI simCardsAPI = SimCardsAPI
.Builder(context)
.build();
// Obtiene las tarjetas SIM insertadas en el dispositivo
List<SimCard> simCards = simCardsAPI.getSimCards();
</code></pre>
<h3>Realizar llamadas con una SIM</h3>
<h4>Kotlin</h4>
<pre><code>simcCards.last().makeCall(context, "51234567")
</code></pre>
<h4>Java</h4>
<pre><code>SimCardExtensionKt.makeCall(simCards.get(0), context, "51234567")
</code></pre>
<h3>Obtener saldo de la tarjeta SIM</h3>
<p>Para obtener el saldo de la primera tarjeta SIM de la lista, puedes seguir estos pasos:</p>
<h4>Kotlin</h4>
<pre><code>// Obtener la primera SIM de la lista
val firstSimCard = simCards.first()
var balance: MainBalance? = null
// Enviar la solicitud
firstSimCard.ussdExecute(
"*222#",
object : ConsultBalanceCallBack {
override fun onRequesting(consultType: UssdConsultType) {
Toast.makeText(context, "Consultando saldo...", Toast.LENGTH_LONG).show()
}
override fun onSuccess(ussdResponse: UssdResponse) {
when (ussdResponse) {
is UssdResponse.Custom -> {
// Convierte el objeto UssdResponse en un objeto MainBalance
balance = ussdResponse.response.parseMainBalance()
}
else -> {}
}
}
override fun onFailure(throwable: Throwable) {
throw throwable
}
}
)
</code></pre>
<h4>Java</h4>
<pre><code>// Obtener la primera SIM de la lista
SimCard firstSimCard = simCards.get(0);
MainBalance balance;
// Enviar la solicitud
SimCardExtensionKt.ussdExecute(firstSimCard, "*222#", new ConsultBalanceCallBack() {
@Override
public void onRequesting(@NonNull UssdConsultType consultType) {
Toast.makeText(context, "Consultando saldo...", Toast.LENGTH_LONG).show();
}
@Override
public void onSuccess(@NonNull UssdResponse ussdResponse) {
if (ussdResponse instanceof UssdResponse.Custom) {
UssdResponse.Custom customResponse = (UssdResponse.Custom) ussdResponse;
// Convierte el objeto UssdResponse en un objeto MainBalance
balance = parseMainBalance(customResponse.getResponse());
}
}
@Override
public void onFailure(@NonNull Throwable throwable) {
throw throwable;
}
});
</code></pre>
<h3>Consultar todo el saldo disponible.</h3>
<p><code>consultBalance</code> es una función de extensión que realiza las consultas de saldo automáticamente, consulta primero el saldo inicial, y dependiendo de la información que extraiga consulta los demás saldos. O sea, que si en el saldo inicial no detecta paquetes de datos, no ejecutará la consulta (\*222\*328#). Esto puede ser un inconveniente si desea consultar siempre el estado de la tarifa por consumo, una forma de solucionarlo es comprobar si la línea posee información de planes de datos y si no fuese el caso hacer la consulta del estado de la TPC usando la función <code>ussdExecute</code>.</p>
<h4>Kotlin</h4>
<pre><code>if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
simCard.consultBalance(
object : ConsultBalanceCallBack {
override fun onRequesting(consultType: UssdConsultType) {
val consultMessage = when (consultType) {
UssdConsultType.BonusBalance -> "Consultando Bonos"
UssdConsultType.DataBalance -> "Consultando Datos"
UssdConsultType.MessagesBalance -> "Consultando SMS"
UssdConsultType.PrincipalBalance -> "Consultando Saldo"
UssdConsultType.VoiceBalance -> "Consultando Minutos"
is UssdConsultType.Custom -> ""
}
Toast.makeText(context, consultMessage, Toast.LENGTH_LONG).show()
}
override fun onSuccess(ussdResponse: UssdResponse) {
when (ussdResponse) {
is UssdResponse.BonusBalance -> {
// Contiene la información extraida de la consulta de bono (*222*266#).
// Es la última operación en realizarse
Toast.makeText(
context,
"${ussdResponse.credit}",
Toast.LENGTH_LONG
).show()
}
is UssdResponse.DataBalance -> {
// Contiene la información extraida de la consulta de datos (*222*328#).
// Solo se ejecuta si se detecta paquetes de datos en el saldo principal.
Toast.makeText(
context,
"${ussdResponse.usageBasedPricing}",
Toast.LENGTH_LONG
).show()
}
is UssdResponse.MessagesBalance -> {
// Contiene la información extraida de la consulta de mensajes (*222*767#).
// Solo se ejecuta si se detecta paquetes de SMS en el saldo principal.
Toast.makeText(
context,
"${ussdResponse.count}",
Toast.LENGTH_LONG
).show()
}
is UssdResponse.PrincipalBalance -> {
// Contiene la información extraida de la consulta de saldo (*222#).
// Es la primera operación en realizarse
Toast.makeText(
context,
"${ussdResponse.credit}",
Toast.LENGTH_LONG
).show()
}
is UssdResponse.VoiceBalance -> {
// Contiene la información extraida de la consulta de mensajes (*222*869#).
// Solo se ejecuta si se detecta paquetes de Voz en el saldo principal.
Toast.makeText(
context,
"${ussdResponse.count}",
Toast.LENGTH_LONG
).show()
}
is UssdResponse.Custom -> {
// No se ejecuta en la consulta de saldo automática.
}
}
}
}
)
}
</code></pre>
<h4>Java</h4>
<pre><code>if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
SimCardExtensionKt.ussdExecute(firstSimCard, new ConsultBalanceCallBack() {
@SuppressLint("MissingPermission")
@Override
public void onRequesting(@NonNull UssdConsultType consultType) {
String consultMessage;
if (consultType instanceof UssdConsultType.BonusBalance) {
consultMessage = "Consultando Bonos...";
} else if (consultType instanceof UssdConsultType.DataBalance) {
consultMessage = "Consultando Datos...";
} else if (consultType instanceof UssdConsultType.MessagesBalance) {
consultMessage = "Consultando SMS...";
} else if (consultType instanceof UssdConsultType.PrincipalBalance) {
consultMessage = "Consultando Saldo...";
} else if (consultType instanceof UssdConsultType.VoiceBalance) {
consultMessage = "Consultando Minutos...";
} else {
consultMessage = "";
}
Toast.makeText(context, consultMessage, Toast.LENGTH_LONG).show();
}
@Override
public void onSuccess(@NonNull UssdResponse ussdResponse) {
if (ussdResponse instanceof UssdResponse.BonusBalance) {
// Contiene la información extraida de la consulta de bono (*222*266#).
// Es la última operación en realizarse
Toast.makeText(
context,
((UssdResponse.BonusBalance) ussdResponse).getCredit(),
Toast.LENGTH_LONG
).show();
} else if (ussdResponse instanceof UssdResponse.DataBalance) {
// Contiene la información extraida de la consulta de datos (*222*328#).
// Solo se ejecuta si se detecta paquetes de datos en el saldo principal.
Toast.makeText(
context,
((UssdResponse.DataBalance) ussdResponse).getUsageBasedPricing(),
Toast.LENGTH_LONG
).show();
} else if (ussdResponse instanceof UssdResponse.MessagesBalance) {
// Contiene la información extraida de la consulta de mensajes (*222*767#).
// Solo se ejecuta si se detecta paquetes de SMS en el saldo principal.
Toast.makeText(
context,
((UssdResponse.MessagesBalance) ussdResponse).getCount(),
Toast.LENGTH_LONG
).show();
} else if (ussdResponse instanceof UssdResponse.PrincipalBalance) {
// Contiene la información extraida de la consulta de saldo (*222#).
// Es la primera operación en realizarse
Toast.makeText(
context,
((UssdResponse.PrincipalBalance) ussdResponse).getCredit(),
Toast.LENGTH_LONG
).show();
} else if (ussdResponse instanceof UssdResponse.VoiceBalance) {
// Contiene la información extraida de la consulta de mensajes (*222*869#).
// Solo se ejecuta si se detecta paquetes de Voz en el saldo principal.
Toast.makeText(
context,
((UssdResponse.VoiceBalance) ussdResponse).getTime(),
Toast.LENGTH_LONG
).show();
}
}
@Override
public void onFailure(@NonNull Throwable throwable) {
throwable.printStackTrace();
}
});
}
</code></pre>
<h2>Contribución</h2>
<p>¡Gracias por tu interés en colaborar con nuestro proyecto! Nos encanta recibir contribuciones de la
comunidad y valoramos mucho tu tiempo y esfuerzo.</p>
<h3>Cómo contribuir</h3>
<p>Si estás interesado en contribuir, por favor sigue los siguientes pasos:</p>
<ol>
<li>Revisa las issues abiertas para ver si hay alguna tarea en la que puedas ayudar.</li>
<li>Si no encuentras ninguna issue que te interese, por favor abre una nueva issue explicando el problema o la funcionalidad que te gustaría implementar. Asegúrate de incluir toda la información necesaria para que otros puedan entender el problema o la funcionalidad que estás proponiendo.</li>
<li>Si ya tienes una issue asignada o si has decidido trabajar en una tarea existente, por favor crea un fork del repositorio y trabaja en una nueva rama (<code>git checkout -b nombre-de-mi-rama</code>).</li>
<li>Cuando hayas terminado de trabajar en la tarea, crea un pull request explicando los cambios que has realizado y asegurándote de que el código cumple con nuestras directrices de estilo y calidad.</li>
<li>Espera a que uno de nuestros colaboradores revise el pull request y lo apruebe o sugiera cambios adicionales.</li>
</ol>
<h3>Directrices de contribución</h3>
<p>Por favor, asegúrate de seguir nuestras directrices de contribución para que podamos revisar y aprobar tus cambios de manera efectiva:</p>
<ul>
<li>Sigue los estándares de codificación y estilo de nuestro proyecto.</li>
<li>Asegúrate de que el código nuevo esté cubierto por pruebas unitarias.</li>
<li>Documenta cualquier cambio que hagas en la documentación del proyecto.</li>
</ul>
<p>¡Gracias de nuevo por tu interés en contribuir! Si tienes alguna pregunta o necesitas ayuda, no dudes en ponerte en contacto con nosotros en la sección de issues o enviándonos un mensaje directo.</p>
<h3>Licencia</h3>
<p>Este proyecto está licenciado bajo la Licencia MIT. Esto significa que tienes permiso para utilizar, copiar, modificar, fusionar, publicar, distribuir, sublicenciar y/o vender copias del software, y para permitir que las personas a las que se les proporcione el software lo hagan, con sujeción a las siguientes condiciones:</p>
<ul>
<li>Se debe incluir una copia de la licencia en todas las copias o partes sustanciales del software.</li>
<li>El software se proporciona "tal cual", sin garantía de ningún tipo, expresa o implícita, incluyendo pero no limitado a garantías de comerciabilidad, aptitud para un propósito particular y no infracción. En ningún caso los autores o titulares de la licencia serán responsables de cualquier reclamo, daño u otra responsabilidad, ya sea en una acción de contrato, agravio o de otra manera, que surja de, fuera de o en conexión con el software o el uso u otros tratos en el software.</li>
</ul>
<p>Puedes encontrar una copia completa de la Licencia MIT en el archivo LICENSE que se incluye en este repositorio.</p>
<h3>Contacto</h3>
<p>Si tienes alguna pregunta o comentario sobre el proyecto, no dudes en ponerte en contacto conmigo a través de los siguientes medios:</p>
<ul>
<li>Correo electrónico: <a href="mailto:lesclaz95@gmail.com">lesclaz95@gmail.com</a></li>
<li>Twitter: <a href="https://twitter.com/lesclaz">@lesclaz</a></li>
<li>Telegram: <a href="https://t.me/lesclaz">@lesclaz</a></li>
</ul>
<p>Estaré encantado de escuchar tus comentarios y responder tus preguntas. ¡Gracias por tu interés en mi proyecto!</p>
</body>
</html>