1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
/***************************************************************************************************
* Copyright © All Contributors. See LICENSE and AUTHORS in the root directory for details.
**************************************************************************************************/
package at.bitfire.davdroid.settings
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.net.ConnectivityManager
import android.os.Build
import androidx.core.content.getSystemService
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import dagger.multibindings.IntKey
import dagger.multibindings.IntoMap
import javax.inject.Inject
class DefaultsProvider(
context: Context,
settingsManager: SettingsManager
): BaseDefaultsProvider(context, settingsManager) {
override val booleanDefaults = mutableMapOf(
Pair(Settings.DISTRUST_SYSTEM_CERTIFICATES, false),
Pair(Settings.SYNC_ALL_COLLECTIONS, false),
Pair(Settings.FORCE_READ_ONLY_ADDRESSBOOKS, false)
)
override val intDefaults = mapOf(
Pair(Settings.PROXY_TYPE, Settings.PROXY_TYPE_SYSTEM),
Pair(Settings.PROXY_PORT, 9050) // Orbot SOCKS
)
override val longDefaults = mapOf<String, Long>(
Pair(Settings.DEFAULT_SYNC_INTERVAL, 4*3600) /* 4 hours */
)
override val stringDefaults = mapOf(
Pair(Settings.PROXY_HOST, "localhost")
)
val dataSaverChangedListener by lazy {
object: BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
evaluateDataSaver(true)
}
}
}
init {
if (Build.VERSION.SDK_INT >= 24) {
val dataSaverChangedFilter = IntentFilter(ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED)
context.registerReceiver(dataSaverChangedListener, dataSaverChangedFilter)
evaluateDataSaver()
}
}
override fun forceReload() {
evaluateDataSaver()
}
override fun close() {
if (Build.VERSION.SDK_INT >= 24)
context.unregisterReceiver(dataSaverChangedListener)
}
fun evaluateDataSaver(notify: Boolean = false) {
if (Build.VERSION.SDK_INT >= 24) {
context.getSystemService<ConnectivityManager>()?.let { connectivityManager ->
if (connectivityManager.restrictBackgroundStatus == ConnectivityManager.RESTRICT_BACKGROUND_STATUS_ENABLED)
booleanDefaults[AccountSettings.KEY_WIFI_ONLY] = true
else
booleanDefaults -= AccountSettings.KEY_WIFI_ONLY
}
if (notify)
settingsManager.onSettingsChanged()
}
}
class Factory @Inject constructor(): SettingsProviderFactory {
override fun getProviders(context: Context, settingsManager: SettingsManager) =
listOf(DefaultsProvider(context, settingsManager))
}
@Module
@InstallIn(SingletonComponent::class)
abstract class DefaultsProviderFactoryModule {
@Binds
@IntoMap @IntKey(/* priority */ 0)
abstract fun factory(impl: Factory): SettingsProviderFactory
}
}
|