diff --git a/ring-android/app/src/main/java/cx/ring/service/ISipService.aidl b/ring-android/app/src/main/java/cx/ring/service/ISipService.aidl index 5281c5e7f7e8ef6c27a7292efacb829bad0990d4..bd77ecfcf998cba38a5c823f7d75b46e83a82727 100644 --- a/ring-android/app/src/main/java/cx/ring/service/ISipService.aidl +++ b/ring-android/app/src/main/java/cx/ring/service/ISipService.aidl @@ -23,6 +23,8 @@ interface ISipService { Map getAccountTemplate(in String accountType); void registerAllAccounts(); void setAccountDetails(in String accountId, in Map accountDetails); + void setAccountActive(in String accountId, in boolean active); + void setAccountsActive(in boolean active); List getCredentials(in String accountID); void setCredentials(in String accountID, in List creds); void setAudioPlugin(in String callID); diff --git a/ring-android/app/src/main/java/cx/ring/service/LocalService.java b/ring-android/app/src/main/java/cx/ring/service/LocalService.java index fcce36791b48b4bbffc85819d736ec41a4839454..34e5a91b27870a5e3ac575259ae450fb28efa46c 100644 --- a/ring-android/app/src/main/java/cx/ring/service/LocalService.java +++ b/ring-android/app/src/main/java/cx/ring/service/LocalService.java @@ -78,7 +78,8 @@ import cx.ring.model.TextMessage; import cx.ring.model.account.Account; -public class LocalService extends Service { +public class LocalService extends Service +{ static final String TAG = LocalService.class.getSimpleName(); static public final String ACTION_CONF_UPDATE = BuildConfig.APPLICATION_ID + ".action.CONF_UPDATE"; static public final String ACTION_ACCOUNT_UPDATE = BuildConfig.APPLICATION_ID + ".action.ACCOUNT_UPDATE"; @@ -109,6 +110,9 @@ public class LocalService extends Service { private LruCache<Long, Bitmap> mMemoryCache = null; private final ExecutorService mPool = Executors.newCachedThreadPool(); + private boolean isWifiConn = false; + private boolean isMobileConn = false; + public ContactsLoader.Result getSortedContacts() { Log.w(TAG, "getSortedContacts " + lastContactLoaderResult.contacts.size() + " contacts, " + lastContactLoaderResult.starred.size() + " starred."); return lastContactLoaderResult; @@ -126,6 +130,13 @@ public class LocalService extends Service { return systemContactCache; } + public boolean isConnected() { + return isWifiConn || isMobileConn; + } + public boolean isWifiConnected() { + return isWifiConn; + } + public interface Callbacks { ISipService getRemoteService(); LocalService getService(); @@ -159,7 +170,13 @@ public class LocalService extends Service { historyManager = new HistoryManager(this); Intent intent = new Intent(this, SipService.class); startService(intent); - bindService(intent, mConnection, BIND_AUTO_CREATE | BIND_IMPORTANT | BIND_ABOVE_CLIENT ); + bindService(intent, mConnection, BIND_AUTO_CREATE | BIND_IMPORTANT | BIND_ABOVE_CLIENT); + + ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo ni = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI); + isWifiConn = ni != null && ni.isConnected(); + ni = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); + isMobileConn = ni != null && ni.isConnected(); } @Override @@ -184,11 +201,11 @@ public class LocalService extends Service { private final Loader.OnLoadCompleteListener<ArrayList<Account>> onAccountsLoaded = new Loader.OnLoadCompleteListener<ArrayList<Account>>() { @Override public void onLoadComplete(Loader<ArrayList<Account>> loader, ArrayList<Account> data) { - Log.w(TAG, "AccountsLoader Loader.OnLoadCompleteListener"); + Log.w(TAG, "AccountsLoader Loader.OnLoadCompleteListener " + data.size()); all_accounts = data; accounts = all_accounts.subList(0,data.size()-1); ip2ip_account = all_accounts.subList(data.size()-1,data.size()); - sendBroadcast(new Intent(ACTION_ACCOUNT_UPDATE)); + updateConnectivityState(); } }; private final Loader.OnLoadCompleteListener<ContactsLoader.Result> onSystemContactsLoaded = new Loader.OnLoadCompleteListener<ContactsLoader.Result>() { @@ -201,7 +218,7 @@ public class LocalService extends Service { for (CallContact c : data.contacts) systemContactCache.put(c.getId(), c); - sendBroadcast(new Intent(ACTION_ACCOUNT_UPDATE)); + sendBroadcast(new Intent(ACTION_CONF_UPDATE)); } }; @@ -830,15 +847,35 @@ public class LocalService extends Service { } } + private void updateConnectivityState() { + ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + + NetworkInfo ni = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI); + Log.w(TAG, "ActiveNetworkInfo (Wifi): " + (ni == null ? "null" : ni.toString())); + isWifiConn = ni != null && ni.isConnected(); + + ni = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); + Log.w(TAG, "ActiveNetworkInfo (mobile): " + (ni == null ? "null" : ni.toString())); + isMobileConn = ni != null && ni.isConnected(); + + try { + getRemoteService().setAccountsActive(isWifiConn); + } catch (RemoteException e) { + e.printStackTrace(); + } + + // if account list loaded + if (!ip2ip_account.isEmpty()) + sendBroadcast(new Intent(ACTION_ACCOUNT_UPDATE)); + } + private final BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { switch(intent.getAction()) { case ConnectivityManager.CONNECTIVITY_ACTION: Log.w(TAG, "ConnectivityManager.CONNECTIVITY_ACTION " + " " + intent.getStringExtra(ConnectivityManager.EXTRA_EXTRA_INFO) + " " + intent.getStringExtra(ConnectivityManager.EXTRA_EXTRA_INFO)); - ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); - NetworkInfo ni = cm.getActiveNetworkInfo(); - Log.w(TAG, "ActiveNetworkInfo: " + (ni == null ? "null" : ni.toString())); + updateConnectivityState(); break; case ConfigurationManagerCallback.ACCOUNT_STATE_CHANGED: Log.w(TAG, "Received " + intent.getAction() + " " + intent.getStringExtra("Account") + " " + intent.getStringExtra("State") + " " + intent.getIntExtra("code", 0)); diff --git a/ring-android/app/src/main/java/cx/ring/service/SipService.java b/ring-android/app/src/main/java/cx/ring/service/SipService.java index 1e3ea96f5b696c36fc769081b5d6d3f905f38b4d..81ed8862cd0af6b44a41401098999df78f425082 100644 --- a/ring-android/app/src/main/java/cx/ring/service/SipService.java +++ b/ring-android/app/src/main/java/cx/ring/service/SipService.java @@ -660,6 +660,30 @@ public class SipService extends Service { }); } + @Override + public void setAccountActive(final String accountId, final boolean active) { + getExecutor().execute(new SipRunnable() { + @Override + protected void doRun() throws SameThreadException { + Log.i(TAG, "SipService.setAccountActive() thread running... " + accountId + " -> " + active); + Ringservice.setAccountActive(accountId, active); + } + }); + } + + @Override + public void setAccountsActive(final boolean active) { + getExecutor().execute(new SipRunnable() { + @Override + protected void doRun() throws SameThreadException { + Log.i(TAG, "SipService.setAccountsActive() thread running... " + active); + StringVect list = Ringservice.getAccountList(); + for (int i=0, n=list.size(); i<n; i++) + Ringservice.setAccountActive(list.get(i), active); + } + }); + } + @Override public Map<String, String> getVolatileAccountDetails(final String accountId) { return getExecutor().executeAndReturn(new SipRunnableWithReturn<Map<String, String>>() { diff --git a/ring-android/app/src/main/jni/configurationmanager.i b/ring-android/app/src/main/jni/configurationmanager.i index 2450194c3c99952947f22d84ead1f51300399ee5..9cfc514d2f21194283b904eefda776e2a2dc55f4 100644 --- a/ring-android/app/src/main/jni/configurationmanager.i +++ b/ring-android/app/src/main/jni/configurationmanager.i @@ -61,6 +61,7 @@ namespace DRing { std::map<std::string, std::string> getAccountDetails(const std::string& accountID); std::map<std::string, std::string> getVolatileAccountDetails(const std::string& accountID); void setAccountDetails(const std::string& accountID, const std::map<std::string, std::string>& details); +void setAccountActive(const std::string& accountID, bool active); std::map<std::string, std::string> getAccountTemplate(const std::string& accountType); std::string addAccount(const std::map<std::string, std::string>& details); void removeAccount(const std::string& accountID);