Skip to content

Commit 1c1c89f

Browse files
authored
Merge pull request #8698 from vector-im/feature/bma/mdm
Implement Mobile Device Manager feature with 3 keys.
2 parents 9652932 + 6452b5c commit 1c1c89f

File tree

16 files changed

+213
-7
lines changed

16 files changed

+213
-7
lines changed

changelog.d/8698.feature

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
Add support for Mobile Device Management.
2+
The keys are:
3+
- default homeserver URL `im.vector.app.serverConfigDefaultHomeserverUrlString`
4+
- push gateway URL `im.vector.app.serverConfigSygnalAPIUrlString`
5+
- permalink base URL `im.vector.app.clientPermalinkBaseUrl`

vector-app/src/gplay/java/im/vector/app/push/fcm/VectorFirebaseMessagingService.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ import im.vector.app.core.pushers.PushParser
2626
import im.vector.app.core.pushers.PushersManager
2727
import im.vector.app.core.pushers.UnifiedPushHelper
2828
import im.vector.app.core.pushers.VectorPushHandler
29+
import im.vector.app.features.mdm.MdmData
30+
import im.vector.app.features.mdm.MdmService
2931
import im.vector.app.features.settings.VectorPreferences
3032
import kotlinx.coroutines.CoroutineScope
3133
import kotlinx.coroutines.SupervisorJob
@@ -46,13 +48,15 @@ class VectorFirebaseMessagingService : FirebaseMessagingService() {
4648
@Inject lateinit var pushParser: PushParser
4749
@Inject lateinit var vectorPushHandler: VectorPushHandler
4850
@Inject lateinit var unifiedPushHelper: UnifiedPushHelper
51+
@Inject lateinit var mdmService: MdmService
4952

5053
private val scope = CoroutineScope(SupervisorJob())
5154

5255
override fun onDestroy() {
5356
scope.cancel()
5457
super.onDestroy()
5558
}
59+
5660
override fun onNewToken(token: String) {
5761
Timber.tag(loggerTag.value).d("New Firebase token")
5862
fcmHelper.storeFcmToken(token)
@@ -62,7 +66,13 @@ class VectorFirebaseMessagingService : FirebaseMessagingService() {
6266
unifiedPushHelper.isEmbeddedDistributor()
6367
) {
6468
scope.launch {
65-
pushersManager.enqueueRegisterPusher(token, getString(R.string.pusher_http_url))
69+
pushersManager.enqueueRegisterPusher(
70+
pushKey = token,
71+
gateway = mdmService.getData(
72+
mdmData = MdmData.DefaultPushGatewayUrl,
73+
defaultValue = getString(R.string.pusher_http_url),
74+
),
75+
)
6676
}
6777
}
6878
}

vector-app/src/main/AndroidManifest.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@
2020
tools:ignore="UnusedAttribute"
2121
tools:replace="android:allowBackup">
2222

23+
<meta-data
24+
android:name="android.content.APP_RESTRICTIONS"
25+
android:resource="@xml/vector_app_restrictions" />
26+
2327
<!-- Activity alias for the launcher Activity (must be declared after the Activity it targets) -->
2428
<!-- exported="true" is required to launch application -->
2529
<activity-alias

vector-app/src/main/java/im/vector/app/core/di/SingletonModule.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ import im.vector.app.features.analytics.metrics.VectorPlugins
5050
import im.vector.app.features.configuration.VectorCustomEventTypesProvider
5151
import im.vector.app.features.invite.AutoAcceptInvites
5252
import im.vector.app.features.invite.CompileTimeAutoAcceptInvites
53+
import im.vector.app.features.mdm.DefaultMdmService
54+
import im.vector.app.features.mdm.MdmData
55+
import im.vector.app.features.mdm.MdmService
5356
import im.vector.app.features.navigation.DefaultNavigator
5457
import im.vector.app.features.navigation.Navigator
5558
import im.vector.app.features.pin.PinCodeStore
@@ -108,6 +111,9 @@ import javax.inject.Singleton
108111
@Binds
109112
abstract fun bindEmojiSpanify(emojiCompatWrapper: EmojiCompatWrapper): EmojiSpanify
110113

114+
@Binds
115+
abstract fun bindMdmService(service: DefaultMdmService): MdmService
116+
111117
@Binds
112118
abstract fun bindFontScale(fontScale: FontScalePreferencesImpl): FontScalePreferences
113119

@@ -145,6 +151,7 @@ import javax.inject.Singleton
145151
flipperProxy: FlipperProxy,
146152
vectorPlugins: VectorPlugins,
147153
vectorCustomEventTypesProvider: VectorCustomEventTypesProvider,
154+
mdmService: MdmService,
148155
): MatrixConfiguration {
149156
return MatrixConfiguration(
150157
applicationFlavor = BuildConfig.FLAVOR_DESCRIPTION,
@@ -156,6 +163,7 @@ import javax.inject.Singleton
156163
metricPlugins = vectorPlugins.plugins(),
157164
cryptoAnalyticsPlugin = vectorPlugins.cryptoMetricPlugin,
158165
customEventTypesProvider = vectorCustomEventTypesProvider,
166+
clientPermalinkBaseUrl = mdmService.getData(MdmData.PermalinkBaseUrl),
159167
syncConfig = SyncConfig(
160168
syncFilterParams = SyncFilterParams(lazyLoadMembersForStateEvents = true, useThreadNotifications = true)
161169
)

vector-app/src/main/res/values/strings.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,8 @@
22
<resources xmlns:tools="http://schemas.android.com/tools">
33
<!-- The https://github.com/LikeTheSalad/android-stem requires a non empty strings.xml -->
44
<string name="ignored_placeholder" tools:ignore="UnusedResources">ignored</string>
5+
6+
<string name="restriction_default_homeserver_url_title">Default homeserver URL</string>
7+
<string name="restriction_default_push_gateway_title">Default Push gateway</string>
8+
<string name="restriction_permalink_base_url_title">Permalink base url</string>
59
</resources>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<restrictions xmlns:android="http://schemas.android.com/apk/res/android">
3+
<restriction
4+
android:key="im.vector.app.serverConfigDefaultHomeserverUrlString"
5+
android:restrictionType="string"
6+
android:title="@string/restriction_default_homeserver_url_title" />
7+
8+
<restriction
9+
android:key="im.vector.app.serverConfigSygnalAPIUrlString"
10+
android:restrictionType="string"
11+
android:title="@string/restriction_default_push_gateway_title" />
12+
13+
<restriction
14+
android:key="im.vector.app.clientPermalinkBaseUrl"
15+
android:restrictionType="string"
16+
android:title="@string/restriction_permalink_base_url_title" />
17+
18+
</restrictions>

vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ import im.vector.app.features.analytics.AnalyticsTracker
7676
import im.vector.app.features.analytics.plan.MobileScreen
7777
import im.vector.app.features.configuration.VectorConfiguration
7878
import im.vector.app.features.consent.ConsentNotGivenHelper
79+
import im.vector.app.features.mdm.MdmService
7980
import im.vector.app.features.navigation.Navigator
8081
import im.vector.app.features.pin.PinLocker
8182
import im.vector.app.features.pin.PinMode
@@ -171,6 +172,7 @@ abstract class VectorBaseActivity<VB : ViewBinding> : AppCompatActivity(), Maver
171172
@Inject lateinit var activeSessionHolder: ActiveSessionHolder
172173
@Inject lateinit var vectorPreferences: VectorPreferences
173174
@Inject lateinit var errorFormatter: ErrorFormatter
175+
@Inject lateinit var mdmService: MdmService
174176

175177
// For debug only
176178
@Inject lateinit var debugReceiver: DebugReceiver
@@ -412,6 +414,10 @@ abstract class VectorBaseActivity<VB : ViewBinding> : AppCompatActivity(), Maver
412414
rageShake.start()
413415
}
414416
debugReceiver.register(this)
417+
mdmService.registerListener(this) {
418+
// Just log that a change occurred.
419+
Timber.w("MDM data has been updated")
420+
}
415421
}
416422

417423
private val postResumeScheduledActions = mutableListOf<() -> Unit>()
@@ -442,6 +448,7 @@ abstract class VectorBaseActivity<VB : ViewBinding> : AppCompatActivity(), Maver
442448

443449
rageShake.stop()
444450
debugReceiver.unregister(this)
451+
mdmService.unregisterListener(this)
445452
}
446453

447454
override fun onWindowFocusChanged(hasFocus: Boolean) {

vector/src/main/java/im/vector/app/core/pushers/PushersManager.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ import im.vector.app.core.di.ActiveSessionHolder
2222
import im.vector.app.core.resources.AppNameProvider
2323
import im.vector.app.core.resources.LocaleProvider
2424
import im.vector.app.core.resources.StringProvider
25+
import im.vector.app.features.mdm.MdmData
26+
import im.vector.app.features.mdm.MdmService
2527
import org.matrix.android.sdk.api.session.pushers.HttpPusher
2628
import org.matrix.android.sdk.api.session.pushers.Pusher
2729
import java.util.UUID
@@ -37,6 +39,7 @@ class PushersManager @Inject constructor(
3739
private val stringProvider: StringProvider,
3840
private val appNameProvider: AppNameProvider,
3941
private val getDeviceInfoUseCase: GetDeviceInfoUseCase,
42+
private val mdmService: MdmService,
4043
) {
4144
suspend fun testPush() {
4245
val currentSession = activeSessionHolder.getActiveSession()
@@ -50,7 +53,10 @@ class PushersManager @Inject constructor(
5053
}
5154

5255
suspend fun enqueueRegisterPusherWithFcmKey(pushKey: String): UUID {
53-
return enqueueRegisterPusher(pushKey, stringProvider.getString(R.string.pusher_http_url))
56+
return enqueueRegisterPusher(
57+
pushKey = pushKey,
58+
gateway = mdmService.getData(MdmData.DefaultPushGatewayUrl, stringProvider.getString(R.string.pusher_http_url))
59+
)
5460
}
5561

5662
suspend fun enqueueRegisterPusher(

vector/src/main/java/im/vector/app/core/pushers/UnifiedPushHelper.kt

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ import com.squareup.moshi.JsonClass
2424
import im.vector.app.R
2525
import im.vector.app.core.resources.StringProvider
2626
import im.vector.app.core.utils.getApplicationLabel
27+
import im.vector.app.features.mdm.MdmData
28+
import im.vector.app.features.mdm.MdmService
2729
import org.matrix.android.sdk.api.Matrix
2830
import org.matrix.android.sdk.api.cache.CacheStrategy
2931
import org.matrix.android.sdk.api.failure.Failure
@@ -40,6 +42,7 @@ class UnifiedPushHelper @Inject constructor(
4042
private val stringProvider: StringProvider,
4143
private val matrix: Matrix,
4244
private val fcmHelper: FcmHelper,
45+
private val mdmService: MdmService,
4346
) {
4447

4548
@MainThread
@@ -99,7 +102,12 @@ class UnifiedPushHelper @Inject constructor(
99102
// register app_id type upfcm on sygnal
100103
// the pushkey if FCM key
101104
if (UnifiedPush.getDistributor(context) == context.packageName) {
102-
unifiedPushStore.storePushGateway(stringProvider.getString(R.string.pusher_http_url))
105+
unifiedPushStore.storePushGateway(
106+
gateway = mdmService.getData(
107+
mdmData = MdmData.DefaultPushGatewayUrl,
108+
defaultValue = stringProvider.getString(R.string.pusher_http_url),
109+
)
110+
)
103111
onDoneRunnable?.run()
104112
return
105113
}
@@ -185,7 +193,13 @@ class UnifiedPushHelper @Inject constructor(
185193
}
186194

187195
fun getPushGateway(): String? {
188-
return if (isEmbeddedDistributor()) stringProvider.getString(R.string.pusher_http_url)
189-
else unifiedPushStore.getPushGateway()
196+
return if (isEmbeddedDistributor()) {
197+
mdmService.getData(
198+
mdmData = MdmData.DefaultPushGatewayUrl,
199+
defaultValue = stringProvider.getString(R.string.pusher_http_url),
200+
)
201+
} else {
202+
unifiedPushStore.getPushGateway()
203+
}
190204
}
191205
}

vector/src/main/java/im/vector/app/features/homeserver/ServerUrlsRepository.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import javax.inject.Inject
2525

2626
/**
2727
* Object to store and retrieve home and identity server urls.
28+
* Note: this class is not used.
2829
*/
2930
class ServerUrlsRepository @Inject constructor(
3031
@DefaultPreferences
@@ -89,5 +90,5 @@ class ServerUrlsRepository @Inject constructor(
8990
/**
9091
* Return default homeserver url from resources.
9192
*/
92-
fun getDefaultHomeServerUrl() = stringProvider.getString(R.string.matrix_org_server_url)
93+
private fun getDefaultHomeServerUrl() = stringProvider.getString(R.string.matrix_org_server_url)
9394
}

0 commit comments

Comments
 (0)