Skip to content

Commit

Permalink
Measurement: Improve dummy
Browse files Browse the repository at this point in the history
  • Loading branch information
mar-v-in committed May 31, 2024
1 parent d1bfa90 commit 0e4135d
Show file tree
Hide file tree
Showing 5 changed files with 153 additions and 102 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public class AppMetadata extends AutoSafeParcelable {
@Field(15)
public int appType;
@Field(16)
private boolean adIdReportingEnabled;
private boolean adIdReportingEnabled = true;
@Field(17)
public boolean ssaidCollectionEnabled = true;
@Field(18)
Expand All @@ -55,19 +55,19 @@ public class AppMetadata extends AutoSafeParcelable {
@Field(24)
public String gaAppId;
@Field(25)
private String consentSettings;
private String consentSettings = "";
@Field(26)
public String ephemeralAppInstanceId;
public String ephemeralAppInstanceId = "";
@Field(27)
private String sessionStitchingToken;
@Field(28)
private boolean sgtmUploadEnabled;
private boolean sgtmUploadEnabled = false;
@Field(29)
private long targetOsVersion;
@Field(30)
private int consentSource;
private int consentSource = 100;
@Field(31)
private String dmaConsent;
private String dmaConsent = "";
@Field(32)
private int adServicesVersion;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,31 @@

package com.google.android.gms.measurement.internal;

import androidx.annotation.Nullable;
import org.microg.safeparcel.AutoSafeParcelable;

public class UserAttributeParcel extends AutoSafeParcelable {
@Field(1)
public int field1;
public int versionCode = 2;
@Field(2)
public String name;
@Field(3)
public long timestamp;
@Field(4)
public Long field4;
@Nullable
public Long longValue;
@Deprecated
@Field(5)
@Nullable
public Float floatValue;
@Field(6)
public String field6;
@Nullable
public String stringValue;
@Field(7)
public String field7;
@Field(8)
public Double field8;
@Nullable
public Double doubleValue;

public static final Creator<UserAttributeParcel> CREATOR = new AutoCreator<>(UserAttributeParcel.class);
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,5 @@

public class ModuleDescriptor {
public static final String MODULE_ID = "com.google.android.gms.measurement.dynamite";
public static final int MODULE_VERSION = 98;
public static final int MODULE_VERSION = 112;
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,91 +4,119 @@
*/
package com.google.android.gms.measurement.internal

import android.content.Intent
import android.os.Bundle
import android.os.Parcel
import android.os.Parcelable
import android.util.Log
import androidx.annotation.Keep
import androidx.core.os.bundleOf
import com.google.android.gms.dynamic.IObjectWrapper
import com.google.android.gms.dynamic.ObjectWrapper
import com.google.android.gms.measurement.api.internal.*
import org.microg.gms.utils.toHexString
import org.microg.gms.utils.warnOnTransactionIssues
import kotlin.random.Random

private const val TAG = "AppMeasurementService"

@Keep
class AppMeasurementDynamiteService : IAppMeasurementDynamiteService.Stub() {
override fun initialize(context: IObjectWrapper?, params: InitializationParams?, timestamp: Long) {
private var initialized: Boolean = false

private fun returnBundle(receiver: IBundleReceiver?, bundle: Bundle?) = runCatching { receiver?.onBundle(bundle) }
private fun returnResult(receiver: IBundleReceiver?, value: Any?) = returnBundle(receiver, bundleOf("r" to value))

private fun requireInitialized() {
require(initialized) { "Attempting to perform action before initialize." }
}

override fun initialize(context: IObjectWrapper?, params: InitializationParams?, eventTimeMillis: Long) {
Log.d(TAG, "Not yet implemented: initialize")
initialized = true
}

override fun logEvent(str: String?, str2: String?, bundle: Bundle?, z: Boolean, z2: Boolean, timestamp: Long) {
override fun logEvent(origin: String?, name: String?, params: Bundle?, z: Boolean, z2: Boolean, eventTimeMillis: Long) {
requireInitialized()
Log.d(TAG, "Not yet implemented: logEvent")
}

override fun logEventAndBundle(str: String?, str2: String?, bundle: Bundle?, receiver: IBundleReceiver?, j: Long) {
override fun logEventAndBundle(origin: String?, name: String?, params: Bundle?, receiver: IBundleReceiver?, eventTimeMillis: Long) {
requireInitialized()
Log.d(TAG, "Not yet implemented: logEventAndBundle")
receiver?.onBundle(Bundle().apply { putByteArray("r", ByteArray(0)) })
returnResult(receiver, ByteArray(0))
}

override fun setUserProperty(str: String?, str2: String?, obj: IObjectWrapper?, z: Boolean, j: Long) {
Log.d(TAG, "Not yet implemented: setUserProperty")
override fun setUserProperty(origin: String?, name: String?, value: IObjectWrapper?, z: Boolean, eventTimeMillis: Long) {
requireInitialized()
setUserProperty(origin, name, ObjectWrapper.unwrap(value), z, eventTimeMillis)
}

override fun getUserProperties(str: String?, str2: String?, z: Boolean, receiver: IBundleReceiver?) {
Log.d(TAG, "Not yet implemented: getUserProperties")
receiver?.onBundle(Bundle())
private fun setUserProperty(origin: String?, name: String?, value: Any?, z: Boolean, eventTimeMillis: Long) {
Log.d(TAG, "Not yet implemented: setUserProperty($origin, $name, $value, $z)")
}

override fun getMaxUserProperties(str: String?, receiver: IBundleReceiver?) {
Log.d(TAG, "Not yet implemented: getMaxUserProperties")
receiver?.onBundle(Bundle().apply { putInt("r", 25) })
override fun getUserProperties(origin: String?, prefix: String?, includeInternal: Boolean, receiver: IBundleReceiver?) {
requireInitialized()
Log.d(TAG, "Not yet implemented: getUserProperties($origin, $prefix, $includeInternal)")
returnBundle(receiver, Bundle())
}

override fun setUserId(str: String?, j: Long) {
Log.d(TAG, "Not yet implemented: setUserId")
override fun getMaxUserProperties(origin: String?, receiver: IBundleReceiver?) {
requireInitialized()
returnResult(receiver, 25)
}

override fun setUserId(userId: String?, eventTimeMillis: Long) {
if (userId != null && userId.isEmpty()) {
Log.w(TAG, "User ID must be non-empty or null")
} else {
Log.d(TAG, "Not yet implemented: setUserId($userId)")
setUserProperty(null, "_id", userId, true, eventTimeMillis)
}
}

override fun setConditionalUserProperty(bundle: Bundle?, j: Long) {
override fun setConditionalUserProperty(bundle: Bundle?, eventTimeMillis: Long) {
Log.d(TAG, "Not yet implemented: setConditionalUserProperty")
}

override fun clearConditionalUserProperty(str: String?, str2: String?, bundle: Bundle?) {
Log.d(TAG, "Not yet implemented: clearConditionalUserProperty")
override fun clearConditionalUserProperty(name: String?, eventName: String?, bundle: Bundle?) {
Log.d(TAG, "Not yet implemented: clearConditionalUserProperty($name, $eventName)")
}

override fun getConditionalUserProperties(str: String?, str2: String?, receiver: IBundleReceiver?) {
Log.d(TAG, "Not yet implemented: getConditionalUserProperties")
receiver?.onBundle(Bundle().apply { putParcelableArrayList("r", arrayListOf<Parcelable>()) })
override fun getConditionalUserProperties(origin: String?, prefix: String?, receiver: IBundleReceiver?) {
Log.d(TAG, "Not yet implemented: getConditionalUserProperties($origin, $prefix)")
returnResult(receiver, arrayListOf<Bundle>())
}

override fun setMeasurementEnabled(z: Boolean, j: Long) {
Log.d(TAG, "Not yet implemented: setMeasurementEnabled")
override fun setMeasurementEnabled(measurementEnabled: Boolean, eventTimeMillis: Long) {
Log.d(TAG, "Not yet implemented: setMeasurementEnabled($measurementEnabled)")
}

override fun resetAnalyticsData(j: Long) {
override fun resetAnalyticsData(eventTimeMillis: Long) {
Log.d(TAG, "Not yet implemented: resetAnalyticsData")
}

override fun setMinimumSessionDuration(j: Long) {
Log.d(TAG, "Not yet implemented: setMinimumSessionDuration")
override fun setMinimumSessionDuration(minimumSessionDuration: Long) {
Log.d(TAG, "Not yet implemented: setMinimumSessionDuration($minimumSessionDuration)")
}

override fun setSessionTimeoutDuration(j: Long) {
Log.d(TAG, "Not yet implemented: setSessionTimeoutDuration")
override fun setSessionTimeoutDuration(sessionTimeoutDuration: Long) {
Log.d(TAG, "Not yet implemented: setSessionTimeoutDuration($sessionTimeoutDuration)")
}

override fun setCurrentScreen(obj: IObjectWrapper?, str: String?, str2: String?, j: Long) {
Log.d(TAG, "Not yet implemented: setCurrentScreen")
override fun setCurrentScreen(obj: IObjectWrapper?, screenName: String?, className: String?, eventTimeMillis: Long) {
Log.d(TAG, "Not yet implemented: setCurrentScreen($screenName, $className)")
}

override fun getCurrentScreenName(receiver: IBundleReceiver?) {
Log.d(TAG, "Not yet implemented: getCurrentScreenName")
receiver?.onBundle(Bundle().apply { putString("r", null) })
returnResult(receiver, null)
}

override fun getCurrentScreenClass(receiver: IBundleReceiver?) {
Log.d(TAG, "Not yet implemented: getCurrentScreenClass")
receiver?.onBundle(Bundle().apply { putString("r", null) })
returnResult(receiver, null)
}

override fun setInstanceIdProvider(provider: IStringProvider?) {
Expand All @@ -97,64 +125,67 @@ class AppMeasurementDynamiteService : IAppMeasurementDynamiteService.Stub() {

override fun getCachedAppInstanceId(receiver: IBundleReceiver?) {
Log.d(TAG, "Not yet implemented: getCachedAppInstanceId")
receiver?.onBundle(Bundle().apply { putString("r", null) })
returnResult(receiver, null)
}

override fun getAppInstanceId(receiver: IBundleReceiver?) {
Log.d(TAG, "Not yet implemented: getAppInstanceId")
receiver?.onBundle(Bundle().apply { putString("r", null) })
// Generate a random ID -> equivalent to ephemeral app instance id
// Correct behavior would be to generate appropriate AppMetadata and call IMeasurementService.getAppInstanceId
val ephemeralAppInstanceId = Random.nextBytes(32).toHexString("")
returnResult(receiver, ephemeralAppInstanceId)
}

override fun getGmpAppId(receiver: IBundleReceiver?) {
Log.d(TAG, "Not yet implemented: getGmpAppId")
receiver?.onBundle(Bundle().apply { putString("r", null) })
returnResult(receiver, null)
}

override fun generateEventId(receiver: IBundleReceiver?) {
Log.d(TAG, "Not yet implemented: generateEventId")
receiver?.onBundle(Bundle().apply { putLong("r", 1L) })
returnResult(receiver, 1L)
}

override fun beginAdUnitExposure(str: String?, j: Long) {
override fun beginAdUnitExposure(adUnitId: String?, eventElapsedRealtime: Long) {
Log.d(TAG, "Not yet implemented: beginAdUnitExposure")
}

override fun endAdUnitExposure(str: String?, j: Long) {
override fun endAdUnitExposure(adUnitId: String?, eventElapsedRealtime: Long) {
Log.d(TAG, "Not yet implemented: endAdUnitExposure")
}

override fun onActivityStarted(activity: IObjectWrapper?, j: Long) {
override fun onActivityStarted(activity: IObjectWrapper?, eventElapsedRealtime: Long) {
Log.d(TAG, "Not yet implemented: onActivityStarted")
}

override fun onActivityStopped(activity: IObjectWrapper?, j: Long) {
override fun onActivityStopped(activity: IObjectWrapper?, eventElapsedRealtime: Long) {
Log.d(TAG, "Not yet implemented: onActivityStopped")
}

override fun onActivityCreated(activity: IObjectWrapper?, bundle: Bundle?, j: Long) {
override fun onActivityCreated(activity: IObjectWrapper?, savedInstanceState: Bundle?, eventElapsedRealtime: Long) {
Log.d(TAG, "Not yet implemented: onActivityCreated")
}

override fun onActivityDestroyed(activity: IObjectWrapper?, j: Long) {
override fun onActivityDestroyed(activity: IObjectWrapper?, eventElapsedRealtime: Long) {
Log.d(TAG, "Not yet implemented: onActivityDestroyed")
}

override fun onActivityPaused(activity: IObjectWrapper?, j: Long) {
override fun onActivityPaused(activity: IObjectWrapper?, eventElapsedRealtime: Long) {
Log.d(TAG, "Not yet implemented: onActivityPaused")
}

override fun onActivityResumed(activity: IObjectWrapper?, j: Long) {
override fun onActivityResumed(activity: IObjectWrapper?, eventElapsedRealtime: Long) {
Log.d(TAG, "Not yet implemented: onActivityResumed")
}

override fun onActivitySaveInstanceState(activity: IObjectWrapper?, receiver: IBundleReceiver?, j: Long) {
override fun onActivitySaveInstanceState(activity: IObjectWrapper?, receiver: IBundleReceiver?, eventElapsedRealtime: Long) {
Log.d(TAG, "Not yet implemented: onActivitySaveInstanceState")
receiver?.onBundle(Bundle())
returnBundle(receiver, Bundle())
}

override fun performAction(bundle: Bundle?, receiver: IBundleReceiver?, j: Long) {
Log.d(TAG, "Not yet implemented: performAction")
receiver?.onBundle(null)
override fun performAction(bundle: Bundle?, receiver: IBundleReceiver?, eventTimeMillis: Long) {
requireInitialized()
returnBundle(receiver, null)
}

override fun logHealthData(i: Int, str: String?, obj: IObjectWrapper?, obj2: IObjectWrapper?, obj3: IObjectWrapper?) {
Expand All @@ -180,37 +211,46 @@ class AppMeasurementDynamiteService : IAppMeasurementDynamiteService.Stub() {
override fun getTestFlag(receiver: IBundleReceiver?, i: Int) {
Log.d(TAG, "Not yet implemented: getTestFlag")
when(i) {
0 -> receiver?.onBundle(Bundle().apply { putString("r", "---") })
1 -> receiver?.onBundle(Bundle().apply { putLong("r", -1L) })
2 -> receiver?.onBundle(Bundle().apply { putDouble("r", -3.0) })
3 -> receiver?.onBundle(Bundle().apply { putInt("r", -2) })
4 -> receiver?.onBundle(Bundle().apply { putBoolean("r", false) })
0 -> returnResult(receiver, "---")
1 -> returnResult(receiver, -1L)
2 -> returnResult(receiver, 3.0)
3 -> returnResult(receiver, -2)
4 -> returnResult(receiver, false)
}
}

override fun setDataCollectionEnabled(z: Boolean) {
override fun setDataCollectionEnabled(dataCollectionEnabled: Boolean) {
Log.d(TAG, "Not yet implemented: setDataCollectionEnabled")
}

override fun isDataCollectionEnabled(receiver: IBundleReceiver?) {
Log.d(TAG, "Not yet implemented: isDataCollectionEnabled")
receiver?.onBundle(Bundle().apply { putBoolean("r", false) })
returnResult(receiver, false)
}

override fun setDefaultEventParameters(bundle: Bundle?) {
Log.d(TAG, "Not yet implemented: setDefaultEventParameters")
}

override fun setConsent(bundle: Bundle?, j: Long) {
override fun clearMeasurementEnabled(eventTimeMillis: Long) {
Log.d(TAG, "Not yet implemented: clearMeasurementEnabled")
}

override fun setConsent(bundle: Bundle?, eventTimeMillis: Long) {
Log.d(TAG, "Not yet implemented: setConsent")
}

override fun setConsentThirdParty(bundle: Bundle?, j: Long) {
override fun setConsentThirdParty(bundle: Bundle?, eventTimeMillis: Long) {
Log.d(TAG, "Not yet implemented: setConsentThirdParty")
}

override fun clearMeasurementEnabled(j: Long) {
Log.d(TAG, "Not yet implemented: clearMeasurementEnabled")
override fun getSessionId(receiver: IBundleReceiver?) {
Log.d(TAG, "Not yet implemented: getSessionId")
returnBundle(receiver, null)
}

override fun setSgtmDebugInfo(intent: Intent?) {
Log.d(TAG, "Not yet implemented: setSgtmDebugInfo")
}

override fun onTransact(code: Int, data: Parcel, reply: Parcel?, flags: Int): Boolean = warnOnTransactionIssues(code, reply, flags, TAG) { super.onTransact(code, data, reply, flags) }
Expand Down
Loading

0 comments on commit 0e4135d

Please sign in to comment.