Skip to content

Commit 753a809

Browse files
committed
feat(auto-upload): battery saver, batter optimization indication
Signed-off-by: alperozturk96 <alper_ozturk@proton.me>
1 parent 54549a0 commit 753a809

13 files changed

Lines changed: 95 additions & 11 deletions

File tree

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,11 @@ public Connectivity getConnectivity() {
393393
};
394394

395395
PowerManagementService powerManagementServiceMock = new PowerManagementService() {
396+
@Override
397+
public boolean isIgnoringOptimization() {
398+
return true;
399+
}
400+
396401
@NonNull
397402
@Override
398403
public BatteryStatus getBattery() {

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,11 @@ public Connectivity getConnectivity() {
225225
};
226226

227227
PowerManagementService powerManagementServiceMock = new PowerManagementService() {
228+
@Override
229+
public boolean isIgnoringOptimization() {
230+
return true;
231+
}
232+
228233
@NonNull
229234
@Override
230235
public BatteryStatus getBattery() {

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,11 @@ public Connectivity getConnectivity() {
7878
};
7979

8080
private PowerManagementService powerManagementServiceMock = new PowerManagementService() {
81+
@Override
82+
public boolean isIgnoringOptimization() {
83+
return true;
84+
}
85+
8186
@Override
8287
public boolean isPowerSavingEnabled() {
8388
return false;
@@ -226,6 +231,11 @@ public void testUploadOnChargingOnlyButNotCharging() {
226231
@Test
227232
public void testUploadOnChargingOnlyAndCharging() {
228233
PowerManagementService powerManagementServiceMock = new PowerManagementService() {
234+
@Override
235+
public boolean isIgnoringOptimization() {
236+
return true;
237+
}
238+
229239
@Override
230240
public boolean isPowerSavingEnabled() {
231241
return false;

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ abstract class FileUploaderIT : AbstractOnServerIT() {
4343
}
4444

4545
private val powerManagementServiceMock: PowerManagementService = object : PowerManagementService {
46+
override val isIgnoringOptimization: Boolean
47+
get() = true
48+
4649
override val isPowerSavingEnabled: Boolean
4750
get() = false
4851

app/src/main/java/com/nextcloud/client/device/PowerManagementService.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ interface PowerManagementService {
2121
*/
2222
val isPowerSavingEnabled: Boolean
2323

24+
/**
25+
* Checks app is excluded from battery optimization or not
26+
*/
27+
val isIgnoringOptimization: Boolean
28+
2429
/**
2530
* Checks current battery status using platform [android.os.BatteryManager]
2631
*/

app/src/main/java/com/nextcloud/client/device/PowerManagementServiceImpl.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import android.content.Intent
1111
import android.content.IntentFilter
1212
import android.os.BatteryManager
1313
import android.os.PowerManager
14+
import androidx.core.content.ContextCompat.getSystemService
1415
import com.nextcloud.utils.extensions.registerBroadcastReceiver
1516
import com.owncloud.android.datamodel.ReceiverFlag
1617

@@ -27,6 +28,12 @@ internal class PowerManagementServiceImpl(
2728
}
2829
}
2930

31+
override val isIgnoringOptimization: Boolean
32+
get() {
33+
val powerManager = context.getSystemService(Context.POWER_SERVICE) as PowerManager
34+
return powerManager.isIgnoringBatteryOptimizations(context.packageName)
35+
}
36+
3037
override val isPowerSavingEnabled: Boolean
3138
get() {
3239
return platformPowerManager.isPowerSaveMode
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* Nextcloud - Android Client
3+
*
4+
* SPDX-FileCopyrightText: 2026 Alper Ozturk <alper.ozturk@nextcloud.com>
5+
* SPDX-License-Identifier: AGPL-3.0-or-later
6+
*/
7+
8+
package com.nextcloud.ui.component
9+
10+
import android.content.Context
11+
import com.nextcloud.client.device.PowerManagementService
12+
import com.nextcloud.client.di.Injectable
13+
import com.nextcloud.utils.extensions.setVisibleIf
14+
import com.owncloud.android.R
15+
import com.owncloud.android.databinding.AutoUploadBatterySaverWarningBannerBinding
16+
import com.owncloud.android.utils.theme.ViewThemeUtils
17+
import javax.inject.Inject
18+
19+
class AutoUploadWarningCardManager @Inject constructor(
20+
private val powerManagementService: PowerManagementService,
21+
private val viewThemeUtils: ViewThemeUtils,
22+
private val context: Context
23+
) : Injectable {
24+
25+
fun bind(binding: AutoUploadBatterySaverWarningBannerBinding) {
26+
val isBatterySaver = powerManagementService.isPowerSavingEnabled
27+
val isIgnoringOptimization = powerManagementService.isIgnoringOptimization
28+
29+
binding.root.setVisibleIf(isBatterySaver || isIgnoringOptimization)
30+
31+
val messages = listOfNotNull(
32+
if (isBatterySaver) context
33+
.getString(R.string.auto_upload_battery_saver_mode_warning) else null,
34+
if (isIgnoringOptimization) context
35+
.getString(R.string.auto_upload_battery_ignore_optimization_mode_warning) else null
36+
)
37+
38+
binding.message.text = messages.joinToString("\n")
39+
40+
viewThemeUtils.material.themeCardView(binding.root)
41+
}
42+
}

app/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import com.nextcloud.client.jobs.MediaFoldersDetectionWork
3333
import com.nextcloud.client.jobs.NotificationWork
3434
import com.nextcloud.client.jobs.upload.FileUploadWorker
3535
import com.nextcloud.client.preferences.SubFolderRule
36+
import com.nextcloud.ui.component.AutoUploadWarningCardManager
3637
import com.nextcloud.utils.BatteryOptimizationHelper
3738
import com.nextcloud.utils.extensions.getParcelableArgument
3839
import com.nextcloud.utils.extensions.isDialogFragmentReady
@@ -152,6 +153,9 @@ class SyncedFoldersActivity :
152153
@Inject
153154
lateinit var appInfo: AppInfo
154155

156+
@Inject
157+
lateinit var autoUploadWarningCardManager: AutoUploadWarningCardManager
158+
155159
lateinit var binding: SyncedFoldersLayoutBinding
156160
lateinit var adapter: SyncedFolderAdapter
157161

@@ -246,6 +250,7 @@ class SyncedFoldersActivity :
246250
val gridWidth = resources.getInteger(R.integer.media_grid_width)
247251
val lightVersion = resources.getBoolean(R.bool.syncedFolder_light)
248252
adapter = SyncedFolderAdapter(
253+
autoUploadWarningCardManager,
249254
lifecycleScope,
250255
this,
251256
clock,

app/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import com.nextcloud.client.jobs.upload.FileUploadEventBroadcaster
2828
import com.nextcloud.client.jobs.upload.FileUploadHelper
2929
import com.nextcloud.client.jobs.utils.UploadErrorNotificationManager
3030
import com.nextcloud.client.utils.Throttler
31+
import com.nextcloud.ui.component.AutoUploadWarningCardManager
3132
import com.nextcloud.utils.extensions.webDavParentPath
3233
import com.owncloud.android.R
3334
import com.owncloud.android.databinding.UploadListLayoutBinding
@@ -72,6 +73,9 @@ class UploadListActivity :
7273

7374
@Inject lateinit var uploadFileOperationFactory: UploadFileOperationFactory
7475

76+
@Inject
77+
lateinit var autoUploadWarningCardManager: AutoUploadWarningCardManager
78+
7579
private var swipeListRefreshLayout: SwipeRefreshLayout? = null
7680
private var binding: UploadListLayoutBinding? = null
7781

@@ -108,6 +112,7 @@ class UploadListActivity :
108112
adapterHelper = UploadListAdapterHelper(this)
109113
uploadListAdapter = UploadListAdapter(
110114
this,
115+
autoUploadWarningCardManager,
111116
uploadsStorageManager,
112117
userAccountManager,
113118
connectivityService,

app/src/main/java/com/owncloud/android/ui/adapter/SyncedFolderAdapter.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import com.nextcloud.android.common.ui.theme.utils.ColorRole
2525
import com.nextcloud.client.core.Clock
2626
import com.nextcloud.client.device.PowerManagementService
2727
import com.nextcloud.client.network.ConnectivityService
28+
import com.nextcloud.ui.component.AutoUploadWarningCardManager
2829
import com.nextcloud.utils.extensions.calculateScanInterval
2930
import com.nextcloud.utils.extensions.filterEnabledOrWithoutEnabledParent
3031
import com.nextcloud.utils.extensions.hasEnabledParent
@@ -55,6 +56,7 @@ import java.util.concurrent.TimeUnit
5556
*/
5657
@Suppress("LongParameterList", "TooManyFunctions")
5758
class SyncedFolderAdapter(
59+
private val autoUploadWarningCardManager: AutoUploadWarningCardManager,
5860
private val lifecycleScope: LifecycleCoroutineScope,
5961
private val context: Context,
6062
private val clock: Clock,
@@ -264,10 +266,7 @@ class SyncedFolderAdapter(
264266
headerContainer.visibility = View.VISIBLE
265267

266268
if (section == 0) {
267-
autoUploadBatterySaverWarningCard.root.run {
268-
setVisibleIf(powerManagementService.isPowerSavingEnabled)
269-
viewThemeUtils.material.themeCardView(this)
270-
}
269+
autoUploadWarningCardManager.bind(autoUploadBatterySaverWarningCard)
271270
}
272271

273272
val syncedFolder = filteredSyncFolderItems[section]

0 commit comments

Comments
 (0)