Skip to content

Commit 2d83ad4

Browse files
committed
Implement play-services-asterism
1 parent db60565 commit 2d83ad4

18 files changed

Lines changed: 731 additions & 1 deletion

File tree

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2026, microG Project Team
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
apply plugin: 'com.android.library'
7+
apply plugin: 'maven-publish'
8+
apply plugin: 'kotlin-android'
9+
apply plugin: 'kotlin-parcelize'
10+
apply plugin: 'kotlin-kapt'
11+
apply plugin: 'signing'
12+
13+
android {
14+
namespace "org.microg.gms.asterism"
15+
16+
compileSdkVersion androidCompileSdk
17+
buildToolsVersion "$androidBuildVersionTools"
18+
19+
buildFeatures {
20+
aidl = true
21+
}
22+
23+
defaultConfig {
24+
versionName version
25+
minSdkVersion androidMinSdk
26+
targetSdkVersion androidTargetSdk
27+
}
28+
29+
compileOptions {
30+
sourceCompatibility JavaVersion.VERSION_1_8
31+
targetCompatibility JavaVersion.VERSION_1_8
32+
}
33+
34+
kotlinOptions {
35+
jvmTarget = 1.8
36+
}
37+
}
38+
39+
apply from: '../gradle/publish-android.gradle'
40+
41+
description = 'microG service implementation for play-services-asterism'
42+
43+
dependencies {
44+
implementation project(':play-services-base-core')
45+
implementation project(':play-services-constellation')
46+
implementation project(':play-services-iid')
47+
48+
implementation project(':play-services-droidguard')
49+
implementation project(':play-services-tasks-ktx')
50+
51+
kapt project(":safe-parcel-processor")
52+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?xml version="1.0" encoding="utf-8"?><!--
2+
~ Copyright (C) 2013-2017 microG Project Team
3+
~
4+
~ Licensed under the Apache License, Version 2.0 (the "License");
5+
~ you may not use this file except in compliance with the License.
6+
~ You may obtain a copy of the License at
7+
~
8+
~ http://www.apache.org/licenses/LICENSE-2.0
9+
~
10+
~ Unless required by applicable law or agreed to in writing, software
11+
~ distributed under the License is distributed on an "AS IS" BASIS,
12+
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
~ See the License for the specific language governing permissions and
14+
~ limitations under the License.
15+
-->
16+
17+
<manifest />
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package com.google.android.gms.asterism;
2+
3+
parcelable GetAsterismConsentRequest;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package com.google.android.gms.asterism;
2+
3+
parcelable GetAsterismConsentResponse;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package com.google.android.gms.asterism;
2+
3+
parcelable SetAsterismConsentRequest;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package com.google.android.gms.asterism;
2+
3+
parcelable SetAsterismConsentResponse;
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.google.android.gms.asterism.internal;
2+
3+
import com.google.android.gms.asterism.internal.IAsterismCallbacks;
4+
import com.google.android.gms.asterism.GetAsterismConsentRequest;
5+
import com.google.android.gms.asterism.SetAsterismConsentRequest;
6+
7+
interface IAsterismApiService {
8+
void getAsterismConsent(
9+
IAsterismCallbacks cb,
10+
in GetAsterismConsentRequest request
11+
);
12+
void setAsterismConsent(
13+
IAsterismCallbacks cb,
14+
in SetAsterismConsentRequest request
15+
);
16+
void getIsPnvrConstellationDevice(
17+
IAsterismCallbacks cb
18+
);
19+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.google.android.gms.asterism.internal;
2+
3+
import com.google.android.gms.common.api.Status;
4+
5+
import com.google.android.gms.asterism.GetAsterismConsentResponse;
6+
import com.google.android.gms.asterism.SetAsterismConsentResponse;
7+
8+
interface IAsterismCallbacks {
9+
void onConsentFetched(in Status status, in GetAsterismConsentResponse response);
10+
void onConsentRegistered(in Status status, in SetAsterismConsentResponse response);
11+
void onIsPnvrConstellationDevice(in Status status, boolean isPnvrDevice);
12+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.google.android.gms.asterism
2+
3+
import android.os.Parcel
4+
import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable
5+
import com.google.android.gms.common.internal.safeparcel.SafeParcelable
6+
import com.google.android.gms.common.internal.safeparcel.SafeParcelable.Constructor
7+
import com.google.android.gms.common.internal.safeparcel.SafeParcelable.Field
8+
import com.google.android.gms.common.internal.safeparcel.SafeParcelable.Param
9+
import org.microg.gms.constellation.proto.AsterismClient
10+
import org.microg.gms.constellation.proto.Consent
11+
import org.microg.gms.constellation.proto.ConsentVersion
12+
13+
@SafeParcelable.Class
14+
data class GetAsterismConsentRequest @Constructor constructor(
15+
@JvmField @Param(1) @Field(1) val requestCode: Int,
16+
@JvmField @Param(2) @Field(2) val asterismClientValue: Int
17+
) : AbstractSafeParcelable() {
18+
val asterismClient: AsterismClient
19+
get() = AsterismClient.fromValue(asterismClientValue) ?: AsterismClient.UNKNOWN_CLIENT
20+
21+
override fun writeToParcel(out: Parcel, flags: Int) = CREATOR.writeToParcel(this, out, flags)
22+
23+
companion object {
24+
@JvmField
25+
val CREATOR = findCreator(GetAsterismConsentRequest::class.java)
26+
}
27+
}
28+
29+
@SafeParcelable.Class
30+
data class GetAsterismConsentResponse @Constructor constructor(
31+
@JvmField @Param(1) @Field(1) val requestCode: Int,
32+
@JvmField @Param(2) @Field(2) val consentStateValue: Int,
33+
@JvmField @Param(3) @Field(3) val gmscoreIidToken: String?,
34+
@JvmField @Param(4) @Field(4) val fid: String?,
35+
@JvmField @Param(5) @Field(5) val consentTypeValue: Int
36+
) : AbstractSafeParcelable() {
37+
constructor(
38+
requestCode: Int,
39+
consentState: Consent,
40+
gmscoreIidToken: String?,
41+
fid: String?,
42+
consentVersion: ConsentVersion
43+
) : this(
44+
requestCode,
45+
if (consentState == Consent.CONSENTED || consentState == Consent.CONSENT_UNKNOWN) consentState.value else Consent.NO_CONSENT.value,
46+
gmscoreIidToken,
47+
fid,
48+
consentVersion.value
49+
)
50+
51+
override fun writeToParcel(out: Parcel, flags: Int) = CREATOR.writeToParcel(this, out, flags)
52+
53+
companion object {
54+
@JvmField
55+
val CREATOR = findCreator(GetAsterismConsentResponse::class.java)
56+
}
57+
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package com.google.android.gms.asterism
2+
3+
import android.os.Bundle
4+
import android.os.Parcel
5+
import com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable
6+
import com.google.android.gms.common.internal.safeparcel.SafeParcelable
7+
import com.google.android.gms.common.internal.safeparcel.SafeParcelable.Constructor
8+
import com.google.android.gms.common.internal.safeparcel.SafeParcelable.Field
9+
import com.google.android.gms.common.internal.safeparcel.SafeParcelable.Param
10+
import org.microg.gms.constellation.proto.AsterismClient
11+
import org.microg.gms.constellation.proto.Consent
12+
import org.microg.gms.constellation.proto.ConsentSource
13+
import org.microg.gms.constellation.proto.ConsentVersion
14+
import org.microg.gms.constellation.proto.FlowContext
15+
16+
@SafeParcelable.Class
17+
data class SetAsterismConsentRequest
18+
@Constructor
19+
constructor(
20+
@JvmField @Param(1) @Field(1) val requestCode: Int,
21+
@JvmField @Param(2) @Field(2) val asterismClientValue: Int,
22+
@JvmField @Param(3) @Field(3) val flowContextValue: Int,
23+
@JvmField @Param(4) @Field(value = 4, type = "int[]") val tosResourceIds: IntArray?,
24+
@JvmField @Param(5) @Field(5) val timestamp: Long?,
25+
@JvmField @Param(6) @Field(6) val consentValue: Int,
26+
@JvmField @Param(7) @Field(7) val extras: Bundle?,
27+
@JvmField @Param(8) @Field(8) val statusValue: Int,
28+
@JvmField @Param(9) @Field(9) val tosUrl: String?,
29+
@JvmField @Param(10) @Field(10) val language: String?,
30+
@JvmField @Param(11) @Field(11) val country: String?,
31+
@JvmField @Param(12) @Field(12) val tosVersion: String?,
32+
@JvmField @Param(13) @Field(13) val tosContentTitle: String?,
33+
@JvmField @Param(14) @Field(14) val accountName: String?,
34+
@JvmField @Param(15) @Field(15) val consentVariant: String?,
35+
@JvmField @Param(16) @Field(16) val consentTrigger: String?,
36+
@JvmField @Param(17) @Field(17) val rcsFlowContextValue: Int,
37+
@JvmField @Param(18) @Field(18) val deviceConsentSourceValue: Int,
38+
@JvmField @Param(19) @Field(19) val deviceConsentVersionValue: Int,
39+
) : AbstractSafeParcelable() {
40+
enum class Status(val value: Int) {
41+
RCS_DEFAULT(0),
42+
RCS_LEGAL_FYI(1),
43+
DEVICE_PNVR(2),
44+
ON_DEMAND(3),
45+
EXPIRED(4);
46+
47+
companion object {
48+
fun fromValue(value: Int): Status = entries.find { it.value == value } ?: EXPIRED
49+
}
50+
}
51+
52+
val asterismClient: AsterismClient
53+
get() = AsterismClient.fromValue(asterismClientValue) ?: AsterismClient.UNKNOWN_CLIENT
54+
55+
val consent: Consent
56+
get() = Consent.fromValue(consentValue) ?: Consent.CONSENT_UNKNOWN
57+
58+
val rcsFlowContext: FlowContext
59+
get() = FlowContext.fromValue(rcsFlowContextValue) ?: FlowContext.FLOW_CONTEXT_UNSPECIFIED
60+
61+
val deviceConsentSource: ConsentSource
62+
get() = ConsentSource.fromValue(deviceConsentSourceValue)
63+
?: ConsentSource.SOURCE_UNSPECIFIED
64+
65+
val deviceConsentVersion: ConsentVersion
66+
get() = ConsentVersion.fromValue(deviceConsentVersionValue).let {
67+
if (it == null || it == ConsentVersion.CONSENT_VERSION_UNSPECIFIED) {
68+
ConsentVersion.PHONE_VERIFICATION_DEFAULT
69+
} else {
70+
it
71+
}
72+
}
73+
74+
fun isDevicePnvrFlow(): Boolean {
75+
return asterismClient == AsterismClient.CONSTELLATION &&
76+
deviceConsentSourceValue > 0 &&
77+
deviceConsentVersionValue > 0
78+
}
79+
80+
val status: Status
81+
get() = Status.fromValue(statusValue)
82+
83+
override fun writeToParcel(out: Parcel, flags: Int) = CREATOR.writeToParcel(this, out, flags)
84+
85+
companion object {
86+
@JvmField
87+
val CREATOR = findCreator(SetAsterismConsentRequest::class.java)
88+
}
89+
}
90+
91+
@SafeParcelable.Class
92+
data class SetAsterismConsentResponse
93+
@Constructor
94+
constructor(
95+
@JvmField @Param(1) @Field(1) val requestCode: Int,
96+
@JvmField @Param(2) @Field(2) val gmscoreIidToken: String?,
97+
@JvmField @Param(3) @Field(3) val fid: String?
98+
) : AbstractSafeParcelable() {
99+
100+
override fun writeToParcel(out: Parcel, flags: Int) = CREATOR.writeToParcel(this, out, flags)
101+
102+
companion object {
103+
@JvmField
104+
val CREATOR = findCreator(SetAsterismConsentResponse::class.java)
105+
}
106+
}

0 commit comments

Comments
 (0)