ConnectivityServiceImpl.java 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. /*
  2. * Nextcloud Android client application
  3. *
  4. * @author Chris Narkiewicz
  5. * Copyright (C) 2019 Chris Narkiewicz <hello@ezaquarii.com>
  6. *
  7. * This program is free software: you can redistribute it and/or modify
  8. * it under the terms of the GNU Affero General Public License as published by
  9. * the Free Software Foundation, either version 3 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU Affero General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Affero General Public License
  18. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  19. */
  20. package com.nextcloud.client.network;
  21. import android.accounts.Account;
  22. import android.net.ConnectivityManager;
  23. import android.net.NetworkInfo;
  24. import com.evernote.android.job.JobRequest;
  25. import com.nextcloud.client.account.UserAccountManager;
  26. import com.owncloud.android.lib.common.OwnCloudAccount;
  27. import com.owncloud.android.lib.common.utils.Log_OC;
  28. import com.owncloud.android.lib.resources.status.OwnCloudVersion;
  29. import org.apache.commons.httpclient.HttpClient;
  30. import org.apache.commons.httpclient.HttpStatus;
  31. import org.apache.commons.httpclient.methods.GetMethod;
  32. import org.json.JSONObject;
  33. import java.io.IOException;
  34. import androidx.core.net.ConnectivityManagerCompat;
  35. import kotlin.jvm.functions.Function1;
  36. class ConnectivityServiceImpl implements ConnectivityService {
  37. private final static String TAG = ConnectivityServiceImpl.class.getName();
  38. private ConnectivityManager connectivityManager;
  39. private UserAccountManager accountManager;
  40. private ClientFactory clientFactory;
  41. private GetRequestBuilder requestBuilder;
  42. static class GetRequestBuilder implements Function1<String, GetMethod> {
  43. @Override
  44. public GetMethod invoke(String url) {
  45. return new GetMethod(url);
  46. }
  47. }
  48. ConnectivityServiceImpl(ConnectivityManager connectivityManager,
  49. UserAccountManager accountManager,
  50. ClientFactory clientFactory,
  51. GetRequestBuilder requestBuilder) {
  52. this.connectivityManager = connectivityManager;
  53. this.accountManager = accountManager;
  54. this.clientFactory = clientFactory;
  55. this.requestBuilder = requestBuilder;
  56. }
  57. @Override
  58. public boolean isInternetWalled() {
  59. if (isOnlineWithWifi()) {
  60. try {
  61. Account account = accountManager.getCurrentAccount();
  62. OwnCloudAccount ocAccount = accountManager.getCurrentOwnCloudAccount();
  63. if (account != null && ocAccount != null) {
  64. OwnCloudVersion serverVersion = accountManager.getServerVersion(account);
  65. String url;
  66. if (serverVersion.compareTo(OwnCloudVersion.nextcloud_13) > 0) {
  67. url = ocAccount.getBaseUri() + "/index.php/204";
  68. } else {
  69. url = ocAccount.getBaseUri() + "/status.php";
  70. }
  71. GetMethod get = requestBuilder.invoke(url);
  72. HttpClient client = clientFactory.createPlainClient();
  73. int status = client.executeMethod(get);
  74. if (serverVersion.compareTo(OwnCloudVersion.nextcloud_13) > 0) {
  75. return !(status == HttpStatus.SC_NO_CONTENT &&
  76. (get.getResponseContentLength() == -1 || get.getResponseContentLength() == 0));
  77. } else {
  78. if (status == HttpStatus.SC_OK) {
  79. try {
  80. // try parsing json to verify response
  81. // check if json contains maintenance and it should be false
  82. String json = get.getResponseBodyAsString();
  83. return new JSONObject(json).getBoolean("maintenance");
  84. } catch (Exception e) {
  85. return true;
  86. }
  87. } else {
  88. return true;
  89. }
  90. }
  91. }
  92. } catch (IOException e) {
  93. Log_OC.e(TAG, "Error checking internet connection", e);
  94. }
  95. } else {
  96. return getActiveNetworkType() == JobRequest.NetworkType.ANY;
  97. }
  98. return true;
  99. }
  100. @Override
  101. public boolean isOnlineWithWifi() {
  102. try {
  103. NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo();
  104. if (activeNetwork.isConnectedOrConnecting()) {
  105. switch (activeNetwork.getType()) {
  106. case ConnectivityManager.TYPE_VPN:
  107. // check if any other network is wifi
  108. for (NetworkInfo networkInfo : connectivityManager.getAllNetworkInfo()) {
  109. if (networkInfo.isConnectedOrConnecting() &&
  110. networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
  111. return true;
  112. }
  113. }
  114. return false;
  115. case ConnectivityManager.TYPE_WIFI:
  116. return true;
  117. default:
  118. return false;
  119. }
  120. } else {
  121. return false;
  122. }
  123. } catch (NullPointerException exception) {
  124. return false;
  125. }
  126. }
  127. @Override
  128. public JobRequest.NetworkType getActiveNetworkType() {
  129. NetworkInfo networkInfo;
  130. try {
  131. networkInfo = connectivityManager.getActiveNetworkInfo();
  132. } catch (Throwable t) {
  133. return JobRequest.NetworkType.ANY;
  134. }
  135. if (networkInfo == null || !networkInfo.isConnectedOrConnecting()) {
  136. return JobRequest.NetworkType.ANY;
  137. }
  138. boolean metered = ConnectivityManagerCompat.isActiveNetworkMetered(connectivityManager);
  139. if (!metered) {
  140. return JobRequest.NetworkType.UNMETERED;
  141. }
  142. if (networkInfo.isRoaming()) {
  143. return JobRequest.NetworkType.CONNECTED;
  144. } else {
  145. return JobRequest.NetworkType.NOT_ROAMING;
  146. }
  147. }
  148. }