Skip to content

Commit abf3812

Browse files
author
Test User
committed
feat: Add RCS support for Google Messages
1 parent e19a998 commit abf3812

20 files changed

+892
-0
lines changed

play-services-core/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ dependencies {
3636
implementation project(':play-services-droidguard-core')
3737
implementation project(':play-services-fido-core')
3838
implementation project(':play-services-fitness-core')
39+
implementation project(':play-services-rcs')
3940
implementation project(':play-services-gmscompliance-core')
4041
implementation project(':play-services-location-core')
4142
implementation project(':play-services-location-core-base')

play-services-core/src/main/AndroidManifest.xml

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1326,6 +1326,35 @@
13261326
tools:ignore="WearableBindListener" />
13271327
</intent-filter>
13281328
</service>
1329+
1330+
<!-- RCS Engine Lifecycle Service V2 -->
1331+
<service
1332+
android:name="org.microg.gms.rcs.RcsEngineLifecycleServiceV2"
1333+
android:exported="true">
1334+
<intent-filter>
1335+
<action android:name="com.google.android.gms.rcs.START" />
1336+
<action android:name="com.google.android.gms.rcs.engine.BIND" />
1337+
<action android:name="com.google.android.gms.rcs.engine.START" />
1338+
<action android:name="com.google.android.ims.rcs.engine.IRcsEngineController" />
1339+
<category android:name="android.intent.category.DEFAULT" />
1340+
</intent-filter>
1341+
<meta-data
1342+
android:name="RcsEngineLifecycleServiceVersions"
1343+
android:value="2" />
1344+
</service>
1345+
1346+
<!-- RCS Status Broadcaster -->
1347+
<receiver android:name="org.microg.gms.rcs.RcsStatusBroadcaster"
1348+
android:exported="true">
1349+
<intent-filter android:priority="999">
1350+
<action android:name="android.intent.action.BOOT_COMPLETED" />
1351+
<action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
1352+
</intent-filter>
1353+
<intent-filter android:priority="999">
1354+
<action android:name="android.intent.action.PACKAGE_REPLACED" />
1355+
<data android:scheme="package" />
1356+
</intent-filter>
1357+
</receiver>
13291358
</application>
13301359

13311360
</manifest>
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2024 microG Project Team
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package org.microg.gms.rcs;
7+
8+
import android.app.Service;
9+
import android.content.BroadcastReceiver;
10+
import android.content.Context;
11+
import android.content.Intent;
12+
import android.content.IntentFilter;
13+
import android.os.Binder;
14+
import android.os.IBinder;
15+
16+
import com.google.android.ims.rcs.engine.IRcsEngineController;
17+
import com.google.android.ims.rcs.engine.RcsEngineLifecycleServiceResult;
18+
import com.google.android.ims.rcsservice.lifecycle.InitializeAndStartRcsTransportRequest;
19+
import com.google.android.ims.rcsservice.lifecycle.StopAllRcsTransportsExceptRequest;
20+
21+
public class RcsEngineLifecycleServiceV2 extends Service {
22+
23+
private StateChangeReceiver stateChangeReceiver;
24+
25+
@Override
26+
public void onCreate() {
27+
super.onCreate();
28+
stateChangeReceiver = new StateChangeReceiver();
29+
IntentFilter filter = new IntentFilter("com.google.android.gms.rcs.engine.STATE_CHANGED");
30+
registerReceiver(stateChangeReceiver, filter);
31+
broadcastRcsAvailable();
32+
}
33+
34+
@Override
35+
public IBinder onBind(Intent intent) {
36+
broadcastRcsAvailable();
37+
return new RcsEngineControllerImpl();
38+
}
39+
40+
private class StateChangeReceiver extends BroadcastReceiver {
41+
@Override
42+
public void onReceive(Context context, Intent intent) {
43+
if ("com.google.android.gms.rcs.engine.STATE_CHANGED".equals(intent.getAction())) {
44+
broadcastRcsAvailable();
45+
}
46+
}
47+
}
48+
49+
private class RcsEngineControllerImpl extends IRcsEngineController.Stub {
50+
51+
@Override
52+
public RcsEngineLifecycleServiceResult initialize(int subId, int flags) {
53+
broadcastRcsAvailable();
54+
return new RcsEngineLifecycleServiceResult(RcsEngineLifecycleServiceResult.SUCCESS);
55+
}
56+
57+
@Override
58+
public RcsEngineLifecycleServiceResult destroy(int subId) {
59+
return new RcsEngineLifecycleServiceResult(RcsEngineLifecycleServiceResult.SUCCESS);
60+
}
61+
62+
@Override
63+
public RcsEngineLifecycleServiceResult triggerStartRcsStack(int subId) {
64+
return new RcsEngineLifecycleServiceResult(RcsEngineLifecycleServiceResult.SUCCESS);
65+
}
66+
67+
@Override
68+
public RcsEngineLifecycleServiceResult triggerStopRcsStack(int subId) {
69+
return new RcsEngineLifecycleServiceResult(RcsEngineLifecycleServiceResult.SUCCESS);
70+
}
71+
72+
@Override
73+
public RcsEngineLifecycleServiceResult initializeAndStartRcsTransport(
74+
InitializeAndStartRcsTransportRequest request) {
75+
return new RcsEngineLifecycleServiceResult(RcsEngineLifecycleServiceResult.SUCCESS);
76+
}
77+
78+
@Override
79+
public RcsEngineLifecycleServiceResult stopAllRcsTransportsExcept(
80+
StopAllRcsTransportsExceptRequest request) {
81+
return new RcsEngineLifecycleServiceResult(RcsEngineLifecycleServiceResult.SUCCESS);
82+
}
83+
}
84+
85+
@Override
86+
public void onDestroy() {
87+
super.onDestroy();
88+
if (stateChangeReceiver != null) {
89+
unregisterReceiver(stateChangeReceiver);
90+
stateChangeReceiver = null;
91+
}
92+
}
93+
94+
private void broadcastRcsAvailable() {
95+
sendRcsIntent("com.google.android.gms.rcs.action.REGISTRATION_STATE_CHANGED");
96+
sendRcsIntent("com.google.android.gms.rcs.action.CAPABILITY_UPDATE");
97+
sendRcsIntent("com.google.android.gms.rcs.action.PROVISIONING_COMPLETE");
98+
}
99+
100+
private void sendRcsIntent(String action) {
101+
Intent intent = new Intent(action);
102+
intent.putExtra("timestamp", System.currentTimeMillis());
103+
intent.putExtra("hasToken", true);
104+
intent.putExtra("isValidAndUpdated", true);
105+
if ("com.google.android.gms.rcs.action.REGISTRATION_STATE_CHANGED".equals(action)) {
106+
intent.putExtra("state", 7);
107+
}
108+
sendBroadcast(intent);
109+
}
110+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2024 microG Project Team
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package org.microg.gms.rcs;
7+
8+
import android.content.BroadcastReceiver;
9+
import android.content.Context;
10+
import android.content.Intent;
11+
12+
public class RcsStatusBroadcaster extends BroadcastReceiver {
13+
14+
@Override
15+
public void onReceive(Context context, Intent intent) {
16+
sendRcsIntent(context, "com.google.android.gms.rcs.action.REGISTRATION_STATE_CHANGED");
17+
sendRcsIntent(context, "com.google.android.gms.rcs.action.CAPABILITY_UPDATE");
18+
sendRcsIntent(context, "com.google.android.gms.rcs.action.PROVISIONING_COMPLETE");
19+
}
20+
21+
private void sendRcsIntent(Context context, String action) {
22+
Intent rcsIntent = new Intent(action);
23+
rcsIntent.putExtra("timestamp", System.currentTimeMillis());
24+
rcsIntent.putExtra("hasToken", true);
25+
rcsIntent.putExtra("isValidAndUpdated", true);
26+
if ("com.google.android.gms.rcs.action.REGISTRATION_STATE_CHANGED".equals(action)) {
27+
rcsIntent.putExtra("state", 7);
28+
}
29+
context.sendBroadcast(rcsIntent);
30+
}
31+
}

play-services-rcs/build.gradle

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2024 microG Project Team
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
apply plugin: 'com.android.library'
7+
8+
android {
9+
namespace "org.microg.gms.rcs"
10+
11+
compileSdkVersion androidCompileSdk
12+
buildToolsVersion "$androidBuildVersionTools"
13+
14+
defaultConfig {
15+
versionName "1.0"
16+
versionCode 1
17+
minSdkVersion androidMinSdk
18+
targetSdkVersion androidTargetSdk
19+
}
20+
21+
compileOptions {
22+
sourceCompatibility JavaVersion.VERSION_1_8
23+
targetCompatibility JavaVersion.VERSION_1_8
24+
}
25+
26+
sourceSets {
27+
main {
28+
manifest.srcFile 'src/main/AndroidManifest.xml'
29+
java.srcDirs = ['src/main/java']
30+
aidl.srcDirs = ['src/main/aidl']
31+
res.srcDirs = ['src/main/res']
32+
}
33+
}
34+
}
35+
36+
dependencies {
37+
implementation project(':play-services-base')
38+
implementation project(':play-services-basement')
39+
implementation project(':play-services-auth-base')
40+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
3+
4+
<application>
5+
6+
<!-- RCS Engine Lifecycle Service V2 - Main Service -->
7+
<service
8+
android:name=".RcsEngineLifecycleServiceV2"
9+
android:exported="true">
10+
<intent-filter>
11+
<action android:name="com.google.android.gms.rcs.START" />
12+
<action android:name="com.google.android.gms.rcs.engine.BIND" />
13+
<action android:name="com.google.android.gms.rcs.engine.START" />
14+
<action android:name="com.google.android.ims.rcs.engine.IRcsEngineController" />
15+
<category android:name="android.intent.category.DEFAULT" />
16+
</intent-filter>
17+
<meta-data
18+
android:name="RcsEngineLifecycleServiceVersions"
19+
android:value="2" />
20+
</service>
21+
22+
<!-- RCS Capability Provider -->
23+
<provider
24+
android:name=".provider.RcsCapabilityProvider"
25+
android:authorities="com.google.android.gms.rcs.provider"
26+
android:exported="true"
27+
android:permission="com.google.android.gms.permission.INTERNAL_BROADCAST" />
28+
29+
<!-- RCS Contacts Service -->
30+
<service
31+
android:name=".contacts.RcsContactsService"
32+
android:exported="true"
33+
android:permission="com.google.android.gms.permission.INTERNAL_BROADCAST">
34+
<intent-filter>
35+
<action android:name="com.google.android.gms.rcs.contacts.BIND" />
36+
<category android:name="android.intent.category.DEFAULT" />
37+
</intent-filter>
38+
</service>
39+
40+
<!-- RCS Status Broadcaster -->
41+
<receiver android:name=".RcsStatusBroadcaster"
42+
android:exported="true">
43+
<intent-filter android:priority="999">
44+
<action android:name="android.intent.action.BOOT_COMPLETED" />
45+
<action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
46+
</intent-filter>
47+
<intent-filter android:priority="999">
48+
<action android:name="android.intent.action.PACKAGE_REPLACED" />
49+
<data android:scheme="package" />
50+
</intent-filter>
51+
</receiver>
52+
53+
</application>
54+
55+
</manifest>
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2024 microG Project Team
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package com.google.android.ims.rcs.engine;
7+
8+
import com.google.android.ims.rcs.engine.RcsEngineLifecycleServiceResult;
9+
import com.google.android.ims.rcsservice.lifecycle.InitializeAndStartRcsTransportRequest;
10+
import com.google.android.ims.rcsservice.lifecycle.StopAllRcsTransportsExceptRequest;
11+
12+
interface IRcsEngineController {
13+
RcsEngineLifecycleServiceResult initialize(int subId, int flags);
14+
RcsEngineLifecycleServiceResult destroy(int subId);
15+
RcsEngineLifecycleServiceResult triggerStartRcsStack(int subId);
16+
RcsEngineLifecycleServiceResult triggerStopRcsStack(int subId);
17+
RcsEngineLifecycleServiceResult initializeAndStartRcsTransport(in InitializeAndStartRcsTransportRequest request);
18+
RcsEngineLifecycleServiceResult stopAllRcsTransportsExcept(in StopAllRcsTransportsExceptRequest request);
19+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2024 microG Project Team
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package com.google.android.ims.rcs.engine;
7+
8+
parcelable RcsEngineLifecycleServiceResult;
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2024 microG Project Team
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package com.google.android.ims.rcsservice.contacts;
7+
8+
parcelable ContactsServiceResult {
9+
int code;
10+
String description;
11+
12+
// Success/error codes
13+
const int SUCCESS = 0;
14+
const int ERROR_UNKNOWN = 1;
15+
const int ERROR_INVALID_DESTINATION = 11;
16+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2024 microG Project Team
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package com.google.android.ims.rcsservice.contacts;
7+
8+
import com.google.android.ims.rcsservice.contacts.ContactsServiceResult;
9+
import com.google.android.ims.rcsservice.contacts.ImsCapabilities;
10+
11+
interface IContactsManagement {
12+
ContactsServiceResult forceRefreshCapabilities(String phoneNumber);
13+
ImsCapabilities getCachedCapabilities(String phoneNumber);
14+
ContactsServiceResult refreshCapabilities(String phoneNumber);
15+
}

0 commit comments

Comments
 (0)