Neste post anterior, mostramos a facilidade de se acessar diretamente a API dos sistemas operacionais móveis (Android ou iOS), para termos acesso a serviços que não estejam disponíveis na biblioteca padrão do Magic xpa.
Já neste vídeo, mostramos que a versão 2.5 do Magic xpa facilitou ainda mais este trabalho, com a nova função ClientNativeCodeExecute().
Agora, vamos combinar as duas coisas e mostrar mais um exemplo de como utilizar estes recursos para melhorar ainda mais nossas aplicações móveis.
Considerando que a estratégia Magic Mobile é baseada na arquitetura Magic RIA, é praticamente inevitável que estas apps possuam dentro de seu fluxo de execução, rotinas para sincronizar dados entre o cliente e o servidor.
Algumas sincronizações, como os metadados da aplicação, são automáticas.
Outras, como os dados produzidos pelo uso da app, são referentes a regras de negócio, e por isso, controladas por nós (desenvolvedores).
Pois bem: imaginando que tenhamos um processo na app para enviar ao servidor, dados capturados pelo usuário (exemplo: pedidos de venda), é conveniente sabermos se o dispositivo (tablet ou smartphone) possui ou não conectividade (internet) antes de acionarmos esta rotina.
Nós poderíamos tentar realizar o envio e através da função ServerLastAccessStatus() ou do evento Unavailable Server, saber se a operação foi bem sucedida ou não.
Mas não é tão eficiente quanto testar a conectividades antes de começar.
Até porque, se a conectividade existente for de baixa qualidade (conexão 2G, por exemplo), podemos querer abortar o processo de sincronização ou alertar o usuário e deixá-lo decidir se quer prosseguir com a ação ou aguardar até conseguir uma conexão melhor.
Em cima dessa ideia, vejamos uma rotina Android que pode ser adicionada ao Magic xpa Client, para nos informar se existe conexão internet disponível, e qual o seu tipo.
Criamos um arquivo chamado
Network.java
E colocamos na pasta “RIAModules\Android\Source\src”
Nele, codificamos uma classe com um método estático que realize a verificação e nos informe os detalhes da conexão atualmente existente:
package com.magicsoftware.magicdev; import com.magicsoftware.core.CoreApplication; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.telephony.TelephonyManager; public class Network { // Retornos esperados: // 0- No network // 1- 2G // 2- 3G // 3- 4G // 4- CDMA // 5- WIFI public static String GetType() { String result = "0"; Context context = CoreApplication.getInstance().getApplicationContext(); ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); if ((mWifi != null) && mWifi.isConnected()) { // Wifi conectado result = "5"; } else { ConnectivityManager connManager1 = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo mMobile = connManager1.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); if ((mMobile != null) && mMobile.isConnected()) { // Internet conectada result = "1"; // 2G switch(mMobile.getSubtype()) { // As opções abaixo podem ser bem mais detalhadas case TelephonyManager.NETWORK_TYPE_CDMA: result = "4"; // CDMA break; case TelephonyManager.NETWORK_TYPE_LTE: case TelephonyManager.NETWORK_TYPE_HSPAP: result = "3"; // 4G break; case TelephonyManager.NETWORK_TYPE_HSDPA: case TelephonyManager.NETWORK_TYPE_HSPA: case TelephonyManager.NETWORK_TYPE_HSUPA: result = "2"; // 3G break; default: break; } } } return result; } } // fim
Devemos agora realizar a compilação de novo client Magic xpa. Para detalhes de todo o procedimento de compilação, reveja nosso Tutorial Mobile.
Com este novo client, podemos então executar a função:
ClientNativeCodeExecute(‘Network.GetType’, ‘A’)
Para sabermos qual o tipo de conexão está disponível:
Os retornos possíveis são:
‘0’- Sem conexão
‘1’- 2G
‘2’- 3G
‘3’- 4G
‘4’- CDMA
‘5’- WIFI
NOTA: A função ClientNativeCodeExecute() do Magic xpa está disponível tanto para iOS quanto para Android.
Boa tarde! a função ClientNativeCodeExecute(), é obrigatório sempre enviar um argumento? Estava testando um retorno de string, apenas chamando a função no comando do java, só para trazer uma string fixa definida no java mesmo mas não funciona.
Olá. Não, você pode usar o identificador ‘0’ para indicar um VOID, como por exemplo: ClientNativeCodeExecute(‘MyClass.MyMethReturnSTR’, ‘0’).
Isso representa uma função que não recebe nenhum argumento, e retorna uma string.