Skip to content

Commit 7d56e29

Browse files
committed
fix network change listener
Signed-off-by: alperozturk96 <[email protected]>
1 parent 264613a commit 7d56e29

File tree

13 files changed

+116
-91
lines changed

13 files changed

+116
-91
lines changed

app/src/androidTest/java/com/nextcloud/test/ConnectivityServiceOfflineMock.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,16 @@ package com.nextcloud.test
88

99
import com.nextcloud.client.network.Connectivity
1010
import com.nextcloud.client.network.ConnectivityService
11+
import com.nextcloud.client.network.NetworkChangeListener
1112

1213
/** A mocked connectivity service returning that the device is offline **/
1314
class ConnectivityServiceOfflineMock : ConnectivityService {
15+
override fun addListener(listener: NetworkChangeListener) = Unit
16+
override fun removeListener(listener: NetworkChangeListener) = Unit
1417
override fun isNetworkAndServerAvailable(callback: ConnectivityService.GenericCallback<Boolean>) {
1518
callback.onComplete(false)
1619
}
17-
1820
override fun isConnected(): Boolean = false
19-
2021
override fun isInternetWalled(): Boolean = false
21-
2222
override fun getConnectivity(): Connectivity = Connectivity.CONNECTED_WIFI
2323
}

app/src/androidTest/java/com/owncloud/android/AbstractIT.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import com.nextcloud.client.jobs.upload.FileUploadWorker;
3333
import com.nextcloud.client.network.Connectivity;
3434
import com.nextcloud.client.network.ConnectivityService;
35+
import com.nextcloud.client.network.NetworkChangeListener;
3536
import com.nextcloud.client.preferences.AppPreferencesImpl;
3637
import com.nextcloud.client.preferences.DarkMode;
3738
import com.nextcloud.common.NextcloudClient;
@@ -371,6 +372,16 @@ public void uploadFile(File file, String remotePath) {
371372

372373
public void uploadOCUpload(OCUpload ocUpload) {
373374
ConnectivityService connectivityServiceMock = new ConnectivityService() {
375+
@Override
376+
public void addListener(@NonNull NetworkChangeListener listener) {
377+
378+
}
379+
380+
@Override
381+
public void removeListener(@NonNull NetworkChangeListener listener) {
382+
383+
}
384+
374385
@Override
375386
public void isNetworkAndServerAvailable(@NonNull GenericCallback<Boolean> callback) {
376387

app/src/androidTest/java/com/owncloud/android/AbstractOnServerIT.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.nextcloud.client.jobs.upload.FileUploadWorker;
2222
import com.nextcloud.client.network.Connectivity;
2323
import com.nextcloud.client.network.ConnectivityService;
24+
import com.nextcloud.client.network.NetworkChangeListener;
2425
import com.owncloud.android.datamodel.OCFile;
2526
import com.owncloud.android.datamodel.UploadsStorageManager;
2627
import com.owncloud.android.db.OCUpload;
@@ -203,6 +204,16 @@ public void uploadOCUpload(OCUpload ocUpload) {
203204

204205
public void uploadOCUpload(OCUpload ocUpload, int localBehaviour) {
205206
ConnectivityService connectivityServiceMock = new ConnectivityService() {
207+
@Override
208+
public void addListener(@NonNull NetworkChangeListener listener) {
209+
210+
}
211+
212+
@Override
213+
public void removeListener(@NonNull NetworkChangeListener listener) {
214+
215+
}
216+
206217
@Override
207218
public void isNetworkAndServerAvailable(@NonNull GenericCallback<Boolean> callback) {
208219

app/src/androidTest/java/com/owncloud/android/UploadIT.java

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import com.nextcloud.client.jobs.upload.FileUploadWorker;
1515
import com.nextcloud.client.network.Connectivity;
1616
import com.nextcloud.client.network.ConnectivityService;
17+
import com.nextcloud.client.network.NetworkChangeListener;
1718
import com.owncloud.android.datamodel.OCFile;
1819
import com.owncloud.android.datamodel.UploadsStorageManager;
1920
import com.owncloud.android.db.OCUpload;
@@ -56,6 +57,16 @@ public class UploadIT extends AbstractOnServerIT {
5657
targetContext.getContentResolver());
5758

5859
private ConnectivityService connectivityServiceMock = new ConnectivityService() {
60+
@Override
61+
public void addListener(@NonNull NetworkChangeListener listener) {
62+
63+
}
64+
65+
@Override
66+
public void removeListener(@NonNull NetworkChangeListener listener) {
67+
68+
}
69+
5970
@Override
6071
public void isNetworkAndServerAvailable(@NonNull GenericCallback<Boolean> callback) {
6172

@@ -268,6 +279,16 @@ public BatteryStatus getBattery() {
268279
@Test
269280
public void testUploadOnWifiOnlyButNoWifi() {
270281
ConnectivityService connectivityServiceMock = new ConnectivityService() {
282+
@Override
283+
public void addListener(@NonNull NetworkChangeListener listener) {
284+
285+
}
286+
287+
@Override
288+
public void removeListener(@NonNull NetworkChangeListener listener) {
289+
290+
}
291+
271292
@Override
272293
public void isNetworkAndServerAvailable(@NonNull GenericCallback<Boolean> callback) {
273294

@@ -285,7 +306,7 @@ public boolean isInternetWalled() {
285306

286307
@Override
287308
public Connectivity getConnectivity() {
288-
return new Connectivity(true, false, false, true);
309+
return new Connectivity(true, false, false, true, false);
289310
}
290311
};
291312
OCUpload ocUpload = new OCUpload(FileStorageUtils.getTemporalPath(account.name) + "/empty.txt",
@@ -357,6 +378,16 @@ public void testUploadOnWifiOnlyAndWifi() {
357378
@Test
358379
public void testUploadOnWifiOnlyButMeteredWifi() {
359380
ConnectivityService connectivityServiceMock = new ConnectivityService() {
381+
@Override
382+
public void addListener(@NonNull NetworkChangeListener listener) {
383+
384+
}
385+
386+
@Override
387+
public void removeListener(@NonNull NetworkChangeListener listener) {
388+
389+
}
390+
360391
@Override
361392
public void isNetworkAndServerAvailable(@NonNull GenericCallback<Boolean> callback) {
362393

@@ -374,7 +405,7 @@ public boolean isInternetWalled() {
374405

375406
@Override
376407
public Connectivity getConnectivity() {
377-
return new Connectivity(true, true, true, true);
408+
return new Connectivity(true, true, true, true, false);
378409
}
379410
};
380411
OCUpload ocUpload = new OCUpload(FileStorageUtils.getTemporalPath(account.name) + "/empty.txt",

app/src/androidTest/java/com/owncloud/android/files/services/FileUploaderIT.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import com.nextcloud.client.jobs.upload.FileUploadHelper
1616
import com.nextcloud.client.jobs.upload.FileUploadWorker
1717
import com.nextcloud.client.network.Connectivity
1818
import com.nextcloud.client.network.ConnectivityService
19+
import com.nextcloud.client.network.NetworkChangeListener
1920
import com.owncloud.android.AbstractOnServerIT
2021
import com.owncloud.android.datamodel.OCFile
2122
import com.owncloud.android.datamodel.UploadsStorageManager
@@ -34,10 +35,10 @@ abstract class FileUploaderIT : AbstractOnServerIT() {
3435
private var uploadsStorageManager: UploadsStorageManager? = null
3536

3637
private val connectivityServiceMock: ConnectivityService = object : ConnectivityService {
38+
override fun addListener(listener: NetworkChangeListener) = Unit
39+
override fun removeListener(listener: NetworkChangeListener) = Unit
3740
override fun isNetworkAndServerAvailable(callback: ConnectivityService.GenericCallback<Boolean>) = Unit
38-
3941
override fun isConnected(): Boolean = false
40-
4142
override fun isInternetWalled(): Boolean = false
4243
override fun getConnectivity(): Connectivity = Connectivity.CONNECTED_WIFI
4344
}

app/src/debug/java/com/nextcloud/test/TestActivity.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import com.nextcloud.client.jobs.download.FileDownloadWorker
1616
import com.nextcloud.client.jobs.upload.FileUploadHelper
1717
import com.nextcloud.client.network.Connectivity
1818
import com.nextcloud.client.network.ConnectivityService
19+
import com.nextcloud.client.network.NetworkChangeListener
1920
import com.nextcloud.utils.EditorUtils
2021
import com.owncloud.android.R
2122
import com.owncloud.android.databinding.TestLayoutBinding
@@ -43,12 +44,11 @@ class TestActivity :
4344
private lateinit var binding: TestLayoutBinding
4445

4546
val connectivityServiceMock: ConnectivityService = object : ConnectivityService {
47+
override fun addListener(listener: NetworkChangeListener) = Unit
48+
override fun removeListener(listener: NetworkChangeListener) = Unit
4649
override fun isNetworkAndServerAvailable(callback: ConnectivityService.GenericCallback<Boolean>) = Unit
47-
4850
override fun isConnected(): Boolean = false
49-
5051
override fun isInternetWalled(): Boolean = false
51-
5252
override fun getConnectivity(): Connectivity = Connectivity.CONNECTED_WIFI
5353
}
5454

app/src/main/java/com/nextcloud/client/di/ComponentsModule.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import com.nextcloud.client.widget.DashboardWidgetConfigurationActivity;
2727
import com.nextcloud.client.widget.DashboardWidgetProvider;
2828
import com.nextcloud.client.widget.DashboardWidgetService;
29-
import com.nextcloud.receiver.NetworkChangeReceiver;
3029
import com.nextcloud.ui.ChooseAccountDialogFragment;
3130
import com.nextcloud.ui.ChooseStorageLocationDialogFragment;
3231
import com.nextcloud.ui.ImageDetailFragment;
@@ -324,9 +323,6 @@ abstract class ComponentsModule {
324323
@ContributesAndroidInjector
325324
abstract BootupBroadcastReceiver bootupBroadcastReceiver();
326325

327-
@ContributesAndroidInjector
328-
abstract NetworkChangeReceiver networkChangeReceiver();
329-
330326
@ContributesAndroidInjector
331327
abstract NotificationWork.NotificationReceiver notificationWorkBroadcastReceiver();
332328

app/src/main/java/com/nextcloud/client/network/ConnectivityService.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,16 @@
99

1010
import android.net.ConnectivityManager;
1111
import android.net.Network;
12-
13-
import com.nextcloud.client.account.Server;
14-
import com.nextcloud.client.account.UserAccountManager;
15-
1612
import androidx.annotation.NonNull;
1713

1814
/**
1915
* This service provides information about current network connectivity
2016
* and server reachability.
2117
*/
2218
public interface ConnectivityService {
19+
void addListener(@NonNull NetworkChangeListener listener);
20+
void removeListener(@NonNull NetworkChangeListener listener);
21+
2322
/**
2423
* Asynchronously checks whether both the device's network connection
2524
* and the Nextcloud server are available.

app/src/main/java/com/nextcloud/client/network/ConnectivityServiceImpl.kt

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import android.os.Build
1414
import com.nextcloud.client.account.UserAccountManager
1515
import com.nextcloud.client.network.ConnectivityService.GenericCallback
1616
import com.nextcloud.operations.GetMethod
17+
import com.nextcloud.utils.extensions.showToast
1718
import com.owncloud.android.lib.common.utils.Log_OC
1819
import kotlinx.coroutines.CoroutineScope
1920
import kotlinx.coroutines.Dispatchers
@@ -25,7 +26,7 @@ import kotlin.jvm.functions.Function1
2526

2627
@Suppress("TooGenericExceptionCaught", "ReturnCount")
2728
class ConnectivityServiceImpl(
28-
context: Context,
29+
private val context: Context,
2930
private val accountManager: UserAccountManager,
3031
private val clientFactory: ClientFactory,
3132
private val requestBuilder: GetRequestBuilder,
@@ -36,13 +37,30 @@ class ConnectivityServiceImpl(
3637
private var availabilityCheckJob: Job? = null
3738
private val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
3839
private var currentConnectivity = Connectivity.DISCONNECTED
40+
private val listeners = mutableSetOf<NetworkChangeListener>()
3941

40-
private val networkCallback = object : ConnectivityManager.NetworkCallback() {
41-
override fun onAvailable(network: Network) {
42-
Log_OC.d(TAG, "network available")
43-
updateConnectivity()
42+
override fun addListener(listener: NetworkChangeListener) {
43+
listeners.add(listener)
44+
}
45+
46+
override fun removeListener(listener: NetworkChangeListener) {
47+
listeners.remove(listener)
48+
}
49+
50+
private fun notifyListeners() {
51+
scope.launch {
52+
val available = !isInternetWalled()
53+
withContext(Dispatchers.Main) {
54+
listeners.forEach {
55+
Log_OC.d(TAG, "notifying listeners")
56+
context.showToast("NOTIFIYING LISTENERS !!!: $available")
57+
it.networkAndServerConnectionListener(available)
58+
}
59+
}
4460
}
61+
}
4562

63+
private val networkCallback = object : ConnectivityManager.NetworkCallback() {
4664
override fun onLost(network: Network) {
4765
Log_OC.w(TAG, "connection lost")
4866
updateConnectivity()
@@ -71,6 +89,8 @@ class ConnectivityServiceImpl(
7189
if (capabilities == null) {
7290
Log_OC.w(TAG, "no active network or capabilities, connectivity is disconnected")
7391
currentConnectivity = Connectivity.DISCONNECTED
92+
walledCheckCache.clear()
93+
notifyListeners()
7494
return
7595
}
7696

@@ -86,6 +106,7 @@ class ConnectivityServiceImpl(
86106
)
87107

88108
walledCheckCache.clear()
109+
notifyListeners()
89110
}
90111

91112
private fun isSupportedTransport(capabilities: NetworkCapabilities) =
@@ -123,7 +144,6 @@ class ConnectivityServiceImpl(
123144
val baseServerAddress = accountManager.user.server.uri.toString()
124145
if (baseServerAddress.isEmpty()) {
125146
Log_OC.e(TAG, "no base server address, internet is walled")
126-
walledCheckCache.setValue(true)
127147
return true
128148
}
129149

@@ -132,28 +152,18 @@ class ConnectivityServiceImpl(
132152

133153
if (activeCapabilities == null) {
134154
Log_OC.e(TAG, "no active network capabilities at check time, treating as walled")
135-
walledCheckCache.setValue(true)
136155
return true
137156
}
138157

139158
val hasLiveTransport = isSupportedTransport(activeCapabilities)
140159
if (!hasLiveTransport) {
141160
Log_OC.e(TAG, "no supported transport at check time, treating as walled")
142-
walledCheckCache.setValue(true)
143161
return true
144162
}
145163

146-
val isVpnActive = activeCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)
147-
if (isVpnActive) {
148-
Log_OC.w(TAG, "skipping server reachability check, VPN is active")
149-
walledCheckCache.setValue(false)
150-
return false
151-
}
152-
153164
val isMeteredNonWifi = !currentConnectivity.isWifi && currentConnectivity.isMetered
154165
if (isMeteredNonWifi) {
155166
Log_OC.w(TAG, "skipping server reachability check, internet is metered and not Wi-Fi")
156-
walledCheckCache.setValue(false)
157167
return false
158168
}
159169

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/*
2+
* Nextcloud - Android Client
3+
*
4+
* SPDX-FileCopyrightText: 2026 Alper Ozturk <[email protected]>
5+
* SPDX-License-Identifier: AGPL-3.0-or-later
6+
*/
7+
8+
package com.nextcloud.client.network
9+
10+
interface NetworkChangeListener {
11+
fun networkAndServerConnectionListener(isNetworkAndServerAvailable: Boolean)
12+
}

0 commit comments

Comments
 (0)