diff --git a/.project b/.project index e2697ca..2f10cfc 100755 --- a/.project +++ b/.project @@ -1,6 +1,6 @@ - VoIpUSSDSample + VoIpUSSD Project BIOX_USSD created by Buildship. diff --git a/README.es.md b/README.es.md index ac2cacb..78eb6c0 100755 --- a/README.es.md +++ b/README.es.md @@ -18,7 +18,7 @@ Para manejar la comunicación ussd, hay que tener presente que la interfaz depen ## USSD LIBRARY -`latestVersion` is 1.0.b +`latestVersion` is 1.1.b Agregar en tu archivo `build.gradle` del proyecto Android: @@ -31,60 +31,122 @@ dependencies { } ``` -Construir una clase que extienda de los servicios de accesibilidad: +* Escribir el archivo xml [acá](https://github.com/romellfudi/VoIpUSSD/blob/master/ussd-library/src/main/res/xml/ussd_service.xml) to res/xml folder (if necessary), this config file allow link between App and SO: -![image](snapshot/G.png#center) +```xml + + +``` -En ella capturara la información de la pantalla USSD con el SO la visualice, para ello existen 2 maneras: +### Application -* via código: +Agregar las dependencias: CALL_PHONE, READ_PHONE_STATE and SYSTEM_ALERT_WINDOW: -![image](snapshot/H.png#center) +```xml + + + +``` -* via xml, el cual deberas vincular en el manifest de tu aplicación: +Agregar el servicio: ```xml - - + + + + + + ``` +# Uso del API: -### Aplicación +Instancia un objeto ussController con su activity -Configuramos en el archivo build.gradle, la extensión para leer librerias *.aar (la cuál crearemos y exportaremos) +```java +ussdController = USSDController.getInstance(activity); +ussdController.callUSSDInvoke(phoneNumber, new USSDController.CallbackInvoke() { + @Override + public void responseInvoke(String message) { + dataToSend <- send "data" into USSD's input text + ussdController.send(dataToSend,new USSDController.CallbackMessage(){ + @Override + public void responseMessage(String message) { + // message has the response string data from USSD + } + }); + } + + @Override + public void over(String message) { + // message has the response string data from USSD + // response no have input text, NOT SEND ANY DATA + } +}); -```gradle -allprojects { repositories { ... - flatDir { dirs 'libs' } } } ``` -Configuramos la dependencia de la libraria ussdlibrary mediante los prefijs {debugCompile: llamar a módulo de la libreria, releaseCompile: llamar al empaquetado *.aar} +Si requiere un flujo de trabajo, tienes que usar la siguiente estructura: -```gradle -dependencies { +```java +ussdController.callUSSDInvoke(phoneNumber, new USSDController.CallbackInvoke() { + @Override + public void responseInvoke(String message) { + // first option list - select option 1 + ussdController.send("1",new USSDController.CallbackMessage(){ + @Override + public void responseMessage(String message) { + // second option list - select option 1 + ussdController.send("1",new USSDController.CallbackMessage(){ + @Override + public void responseMessage(String message) { + ... + } + }); + } + }); + } + + @Override + public void over(String message) { + // message has the response string data from USSD + // response no have input text, NOT SEND ANY DATA + } ... - //debugCompile project(':ussdlibrary') - //releaseCompile(name: 'ussdlibrary-{latestVersion}', ext: 'aar') - implementation 'com.romellfudi.ussdlibrary:ussd-library:{latestVersion}' -} +}); +``` + +## OverlayShowingService Widget (no indispensable) + +Un severo problema al manejar este tipo de widget, este no puede ocultarse, redimencionarse, no puede ser puesto en el fondo con un rogressDialog +Pero recientemente a partir del Android O, Google permite la construcción build a nw kind permission dde widget sobrepuestos, mi solución implementada fue este widget llamdo `OverlayShowingService`: +For use need add permissions at AndroidManifest: + +```xml + ``` +Agregar Broadcast Service: -Teniendo importada las dependencias, en el manifest de la aplicación se debe escribir el servicio con los permisos necesarios +```xml + +``` -![image](snapshot/J.png#center) +Invocar como cualquier servicio, necesita un titulo para ser mostrado mientras se ejecuta la llama `callUSSDInvoke` mediante una variable extra `EXTRA`: -![image](snapshot/F.png#center) +```java +Intent svc = new Intent(activity, OverlayShowingService.class); +svc.putExtra(OverlayShowingService.EXTRA,"PROCESANDO"); +getActivity().startService(svc); +``` -### Uso de la línea voip +### EXTRA: Uso de la línea voip En esta sección dejo las líneas claves para realizar la conexión VOIP-USSD diff --git a/README.md b/README.md index 54f77ed..e93a04a 100755 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ To comunicate with ussd display, It is necessary to have present that the interf ## USSD LIBRARY -`latestVersion` is 1.0.b +`latestVersion` is 1.1.b Add the following in your app's `build.gradle` file: @@ -27,63 +27,126 @@ repositories { jcenter() } dependencies { - compile 'com.romellfudi.ussdlibrary:ussd-library:{latestVersion}' + implementation 'com.romellfudi.ussdlibrary:ussd-library:{latestVersion}' } ``` -Build a accessibility service class: +* Writing xml config file from [here](https://github.com/romellfudi/VoIpUSSD/blob/master/ussd-library/src/main/res/xml/ussd_service.xml) to res/xml folder (if necessary), this config file allow link between App and SO: -![image](snapshot/G.png#center) +```xml + + +``` -Capture information from USSD displaying windows, excist two ways: +### Application -* Writting code: +Puts dependencies on manifest, into manifest put CALL_PHONE, READ_PHONE_STATE and SYSTEM_ALERT_WINDOW: -![image](snapshot/H.png#center) +```xml + + + +``` -* Writting xml, this link manifest to SO: +Add service: ```xml - - + + + + + + ``` +# How use: -### Application +Instance an object ussController with activity -Configure build.gradle file, add exteension for run aar libraries(witch we build and export) +```java +ussdController = USSDController.getInstance(activity); +ussdController.callUSSDInvoke(phoneNumber, new USSDController.CallbackInvoke() { + @Override + public void responseInvoke(String message) { + dataToSend <- send "data" into USSD's input text + ussdController.send(dataToSend,new USSDController.CallbackMessage(){ + @Override + public void responseMessage(String message) { + // message has the response string data from USSD + } + }); + } + + @Override + public void over(String message) { + // message has the response string data from USSD + // response no have input text, NOT SEND ANY DATA + } +}); -```gradle -allprojects { repositories { ... - flatDir { dirs 'libs' } } } ``` -Configure ussd library dependencies on app module {debugCompile: attach library module, releaseCompile: import *.aar library} +if you need work with your custom messages, use this structure: -```gradle -dependencies { +```java +ussdController.callUSSDInvoke(phoneNumber, new USSDController.CallbackInvoke() { + @Override + public void responseInvoke(String message) { + // first option list - select option 1 + ussdController.send("1",new USSDController.CallbackMessage(){ + @Override + public void responseMessage(String message) { + // second option list - select option 1 + ussdController.send("1",new USSDController.CallbackMessage(){ + @Override + public void responseMessage(String message) { + ... + } + }); + } + }); + } + + @Override + public void over(String message) { + // message has the response string data from USSD + // response no have input text, NOT SEND ANY DATA + } ... - //debugCompile project(':ussdlibrary') - //releaseCompile(name: 'ussdlibrary-{latestVersion}', ext: 'aar') - implementation 'com.romellfudi.ussdlibrary:ussd-library:{latestVersion}' -} +}); ``` -Puts dependencies on manifest, into manifest put CALL_PHONE, READ_PHONE_STATE and SYSTEM_ALERT_WINDOW: +## OverlayShowingService Widget (not required) + +A problem huge working with ussd is you cant invisible, disenable, resize or put on back in progressDialog +But now on Android O, Google allow build a nw kind permission from overlay widget, my solution was a widget call OverlayShowingService: +For use need add permissions at AndroidManifest: + +```xml + +``` + +Add Broadcast Service: -![image](snapshot/J.png#center) +```xml + +``` -![image](snapshot/F.png#center) +Invoke like a normal services, need a tittle set extra vallue `EXTRA`: + +```java +Intent svc = new Intent(activity, OverlayShowingService.class); +svc.putExtra(OverlayShowingService.EXTRA,"PROCESANDO"); +getActivity().startService(svc); +``` -### Use Voip line +### EXTRA: Use Voip line In this secction leave the lines to call to Telcom (ussd hadh number) for connected it: diff --git a/app/build.gradle b/app/build.gradle index 10624b3..a129494 100755 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,11 +12,11 @@ android { compileSdkVersion 26 buildToolsVersion "26.0.2" defaultConfig { - applicationId "fudi.freddy.biox_ussd" + applicationId "com.romellfudi.ussd_sample" minSdkVersion 17 targetSdkVersion 26 versionCode 1 - versionName "1.0" + versionName "1.1" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { @@ -28,15 +28,11 @@ android { } dependencies { - compile 'com.android.support:appcompat-v7:26.1.0' - compile 'com.android.support:design:26.1.0' - -// compile(name: 'fudipermission-1.0.a', ext: 'aar') - -// debugCompile project(':ussd-library') -// releaseCompile(name: 'ussdlibrary-1.0.b', ext: 'aar') - + implementation 'com.android.support:appcompat-v7:26.1.0' + implementation 'com.android.support:design:26.1.0' implementation 'com.romellfudi.permission:fudi-permission:1.0.a' - implementation 'com.romellfudi.ussdlibrary:ussd-library:1.0.b' + + implementation project(':ussd-library') +// implementation 'com.romellfudi.ussdlibrary:ussd-library:1.1.b' } diff --git a/app/libs/fudipermission-1.0.a.aar b/app/libs/fudipermission-1.0.a.aar deleted file mode 100644 index d3a87b4..0000000 Binary files a/app/libs/fudipermission-1.0.a.aar and /dev/null differ diff --git a/app/libs/ussdlibrary-1.0.b.aar b/app/libs/ussdlibrary-1.0.b.aar deleted file mode 100644 index 0c53a5d..0000000 Binary files a/app/libs/ussdlibrary-1.0.b.aar and /dev/null differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 79629e9..09e4d47 100755 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,6 @@ + package="com.romellfudi.ussd_sample"> diff --git a/app/src/main/java/fudi/freddy/biox_ussd/act/MainMenuActivity.java b/app/src/main/java/com/romellfudi/ussd_sample/act/MainMenuActivity.java similarity index 98% rename from app/src/main/java/fudi/freddy/biox_ussd/act/MainMenuActivity.java rename to app/src/main/java/com/romellfudi/ussd_sample/act/MainMenuActivity.java index 138814e..f9ccd35 100755 --- a/app/src/main/java/fudi/freddy/biox_ussd/act/MainMenuActivity.java +++ b/app/src/main/java/com/romellfudi/ussd_sample/act/MainMenuActivity.java @@ -1,4 +1,4 @@ -package fudi.freddy.biox_ussd.act; +package com.romellfudi.ussd_sample.act; import android.content.Context; import android.content.DialogInterface; @@ -21,14 +21,14 @@ import android.view.MenuItem; import android.widget.Toast; -import fudi.freddy.biox_ussd.R; -import fudi.freddy.biox_ussd.use_case.CP1; +import com.romellfudi.ussd_sample.R; +import com.romellfudi.ussd_sample.use_case.CP1; import com.romellfudi.ussdlibrary.USSDService; /** * Main Activity * * @author Romell Domínguez - * @version 1.0.a 23/02/2017 + * @version 1.0.b 23/02/2017 * @since 1.0 */ public class MainMenuActivity extends AppCompatActivity diff --git a/app/src/main/java/com/romellfudi/ussd_sample/use_case/CP1.java b/app/src/main/java/com/romellfudi/ussd_sample/use_case/CP1.java new file mode 100755 index 0000000..4964f4f --- /dev/null +++ b/app/src/main/java/com/romellfudi/ussd_sample/use_case/CP1.java @@ -0,0 +1,183 @@ +package com.romellfudi.ussd_sample.use_case; + +import android.content.Intent; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.provider.Settings; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.Toast; + +import java.util.ArrayList; + +import com.romellfudi.ussd_sample.R; +import com.romellfudi.permission.PermissionService; +import com.romellfudi.ussdlibrary.OverlayShowingService; +import com.romellfudi.ussdlibrary.USSDController; + +import android.Manifest.permission; + +/** + * Use Case for Test Windows + * + * @author Romell Domínguez + * @version 1.1.b 27/09/2018 + * @since 1.0.a + */ +public class CP1 extends Fragment { + + TextView result; + EditText phone; + Button btn1,btn2,btn3; + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + new PermissionService(getActivity()).request( + new String[]{permission.CALL_PHONE}, + callback); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.content_op1, container, false); + result = (TextView) view.findViewById(R.id.result); + phone = (EditText) view.findViewById(R.id.phone); + btn1 = (Button) view.findViewById(R.id.btn1); + btn2 = (Button) view.findViewById(R.id.btn2); + btn3 = (Button) view.findViewById(R.id.btn3); + setHasOptionsMenu(false); + + btn1.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String phoneNumber = phone.getText().toString().trim(); + final USSDController ussdController = USSDController.getInstance(getActivity()); + result.setText(""); + ussdController.callUSSDInvoke(phoneNumber, new USSDController.CallbackInvoke() { + @Override + public void responseInvoke(String message) { + Log.d("APP",message); + result.append("\n-\n" + message); + // first option list - select option 1 + ussdController.send("1",new USSDController.CallbackMessage(){ + @Override + public void responseMessage(String message) { + Log.d("APP",message); + result.append("\n-\n" + message); + // second option list - select option 1 + ussdController.send("1",new USSDController.CallbackMessage(){ + @Override + public void responseMessage(String message) { + Log.d("APP",message); + result.append("\n-\n" + message); + } + }); + } + }); + } + + @Override + public void over(String message) { + Log.d("APP",message); + result.append("\n-\n" + message); + } + }); + } + }); + + btn2.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + final Intent svc = new Intent(getActivity(), OverlayShowingService.class); + svc.putExtra(OverlayShowingService.EXTRA,"PROCESANDO"); + getActivity().startService(svc); + Log.d("APP","START OVERLAY DIALOG"); + String phoneNumber = phone.getText().toString().trim(); + final USSDController ussdController = USSDController.getInstance(getActivity()); + result.setText(""); + ussdController.callUSSDInvoke(phoneNumber, new USSDController.CallbackInvoke() { + @Override + public void responseInvoke(String message) { + Log.d("APP",message); + result.append("\n-\n" + message); + // first option list - select option 1 + ussdController.send("1",new USSDController.CallbackMessage(){ + @Override + public void responseMessage(String message) { + Log.d("APP",message); + result.append("\n-\n" + message); + // second option list - select option 1 + ussdController.send("1",new USSDController.CallbackMessage(){ + @Override + public void responseMessage(String message) { + Log.d("APP",message); + result.append("\n-\n" + message); + getActivity().stopService(svc); + Log.d("APP","STOP OVERLAY DIALOG"); + Log.d("APP","successful"); + } + }); + } + }); + } + + @Override + public void over(String message) { + Log.d("APP",message); + result.append("\n-\n" + message); + getActivity().stopService(svc); + Log.d("APP","STOP OVERLAY DIALOG"); + } + }); + } + }); + + btn3.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + USSDController.verifyAccesibilityAccess(getActivity()); + } + }); + + return view; + } + + private PermissionService.Callback callback = new PermissionService.Callback() { + @Override + public void onRefuse(ArrayList RefusePermissions) { + Toast.makeText(getContext(), + getString(R.string.refuse_permissions), + Toast.LENGTH_SHORT).show(); + getActivity().finish(); + } + + @Override + public void onFinally() { + // pass + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (!Settings.canDrawOverlays(getActivity())) { + Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, + Uri.parse("package:" + getActivity().getPackageName())); + startActivity(intent); + } + } + } + }; + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + callback.handler(permissions, grantResults); + } +} + diff --git a/app/src/main/java/fudi/freddy/biox_ussd/use_case/CP1.java b/app/src/main/java/fudi/freddy/biox_ussd/use_case/CP1.java deleted file mode 100755 index d6a890a..0000000 --- a/app/src/main/java/fudi/freddy/biox_ussd/use_case/CP1.java +++ /dev/null @@ -1,107 +0,0 @@ -package fudi.freddy.biox_ussd.use_case; - -import android.content.Intent; -import android.net.Uri; -import android.os.Build; -import android.os.Bundle; -import android.provider.Settings; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.Button; -import android.widget.EditText; -import android.widget.TextView; -import android.widget.Toast; - -import java.util.ArrayList; - -import fudi.freddy.biox_ussd.R; -import com.romellfudi.permission.PermissionService; -import com.romellfudi.ussdlibrary.OverlayShowingService; -import com.romellfudi.ussdlibrary.USSDController; - -import android.Manifest.permission; - -/** - * Use Case for Test Windows - * - * @author Romell Domínguez - * @version 1.0.a 23/02/2017 - * @since 1.0 - */ -public class CP1 extends Fragment { - - TextView result; - EditText phone; - Button btn ; - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - new PermissionService(getActivity()).request( - new String[]{permission.CALL_PHONE}, - callback); - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.content_op1, container, false); - result = (TextView) view.findViewById(R.id.result); - phone = (EditText) view.findViewById(R.id.phone); - btn = (Button) view.findViewById(R.id.btn); - setHasOptionsMenu(false); - - btn.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - final Intent svc = new Intent(getActivity(), OverlayShowingService.class); - svc.putExtra(OverlayShowingService.EXTRA,"PROCESANDO"); - getActivity().startService(svc); - String phoneNumber = phone.getText().toString().trim(); - USSDController ussdController = USSDController.getInstance(getActivity()); - ussdController.callUSSDInvoke(phoneNumber, result, new USSDController.Callback() { - @Override - public void over() { - Log.d("DDD","stop"); - getActivity().stopService(svc); - } - }); - } - }); - - return view; - } - - private PermissionService.Callback callback = new PermissionService.Callback() { - @Override - public void onRefuse(ArrayList RefusePermissions) { - Toast.makeText(getContext(), - getString(R.string.refuse_permissions), - Toast.LENGTH_SHORT).show(); - getActivity().finish(); - } - - @Override - public void onFinally() { - // pass - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - if (!Settings.canDrawOverlays(getActivity())) { - Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, - Uri.parse("package:" + getActivity().getPackageName())); - startActivity(intent); - } - } - } - }; - - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - callback.handler(permissions, grantResults); - } -} - diff --git a/app/src/main/res/layout/content_op1.xml b/app/src/main/res/layout/content_op1.xml index 15ea105..cae6e1d 100755 --- a/app/src/main/res/layout/content_op1.xml +++ b/app/src/main/res/layout/content_op1.xml @@ -27,7 +27,7 @@ android:singleLine="true" />