diff --git a/build.gradle b/build.gradle index a10b8453..b3fcc35f 100644 --- a/build.gradle +++ b/build.gradle @@ -46,8 +46,10 @@ subprojects { kotlin { target '**/*.kt' targetExclude("$buildDir/**/*.kt") - - ktlint() + ktlint().editorConfigOverride([ + "ktlint_standard_comment-wrapping": "disabled", + "max_line_length" : 2147483647, + ]) } groovyGradle { target '*.gradle' diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index cd5a8e4a..439bab80 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,7 +10,7 @@ navigation = "2.5.3" pluginGradle = "7.4.2" # 4.2.2-7.4.2 kotlin = "1.9.21" -spotless = "6.20.0" +spotless = "6.25.0" # https://developer.android.com/jetpack/androidx/releases/compose-compiler # composeBom = "2023.04.00" diff --git a/growingio-annotation/json-serializer/src/main/java/com/growingio/sdk/annotation/json/serializer/JsonFactoryGenerator.kt b/growingio-annotation/json-serializer/src/main/java/com/growingio/sdk/annotation/json/serializer/JsonFactoryGenerator.kt index 9f775464..dbb00f94 100644 --- a/growingio-annotation/json-serializer/src/main/java/com/growingio/sdk/annotation/json/serializer/JsonFactoryGenerator.kt +++ b/growingio-annotation/json-serializer/src/main/java/com/growingio/sdk/annotation/json/serializer/JsonFactoryGenerator.kt @@ -77,9 +77,9 @@ internal class JsonFactoryGenerator( ClassName.get( ProcessUtils.JSON_SERIALIZABLE_PACKAGE, ProcessUtils.JSON_SERIALIZABLE_CLASS, - ), // rawType - ClassName.get(eventType), // the value for T - builderType, // the value for R + ), + ClassName.get(eventType), + builderType, ) val jonSerialBuilder = TypeSpec.classBuilder(generateClass).addJavadoc( diff --git a/growingio-annotation/json-serializer/src/main/java/com/growingio/sdk/annotation/json/serializer/JsonSerializerGenerator.kt b/growingio-annotation/json-serializer/src/main/java/com/growingio/sdk/annotation/json/serializer/JsonSerializerGenerator.kt index 26ba62b9..ec2bebb5 100644 --- a/growingio-annotation/json-serializer/src/main/java/com/growingio/sdk/annotation/json/serializer/JsonSerializerGenerator.kt +++ b/growingio-annotation/json-serializer/src/main/java/com/growingio/sdk/annotation/json/serializer/JsonSerializerGenerator.kt @@ -84,9 +84,9 @@ internal class JsonSerializerGenerator( val builderType = ClassName.get(eventBuilderType) val superinterface = ParameterizedTypeName.get( - ClassName.get(JSON_SERIALIZABLE_PACKAGE, JSON_SERIALIZABLE_CLASS), // rawType - ClassName.get(eventType), // the value for T - builderType, // the value for R + ClassName.get(JSON_SERIALIZABLE_PACKAGE, JSON_SERIALIZABLE_CLASS), + ClassName.get(eventType), + builderType, ) val jonSerialBuilder = TypeSpec.classBuilder(generateClass).addJavadoc( diff --git a/growingio-autotracker-core/src/main/java/com/growingio/android/sdk/autotrack/AutotrackConfig.java b/growingio-autotracker-core/src/main/java/com/growingio/android/sdk/autotrack/AutotrackConfig.java index 87bc6556..5202f38c 100644 --- a/growingio-autotracker-core/src/main/java/com/growingio/android/sdk/autotrack/AutotrackConfig.java +++ b/growingio-autotracker-core/src/main/java/com/growingio/android/sdk/autotrack/AutotrackConfig.java @@ -25,6 +25,7 @@ public class AutotrackConfig implements Configurable { private float mImpressionScale = 0; private boolean enableFragmentTag = false; + private boolean customEventWithPage = true; private final AutotrackOptions mAutotrackOptions = new AutotrackOptions(); private boolean autotrackEnabled = true; @@ -154,4 +155,16 @@ public AutotrackConfig setAutotrack(boolean enabled) { this.autotrackEnabled = enabled; return this; } + + /** + * Refer the custom event with the page. If called, the custom event will be associated with the page path. + */ + public AutotrackConfig referCustomEventWithPage() { + this.customEventWithPage = true; + return this; + } + + public boolean isReferCustomEventWithPage() { + return this.customEventWithPage; + } } diff --git a/growingio-autotracker-core/src/main/java/com/growingio/android/sdk/autotrack/Autotracker.java b/growingio-autotracker-core/src/main/java/com/growingio/android/sdk/autotrack/Autotracker.java index d15629e9..880f5cec 100644 --- a/growingio-autotracker-core/src/main/java/com/growingio/android/sdk/autotrack/Autotracker.java +++ b/growingio-autotracker-core/src/main/java/com/growingio/android/sdk/autotrack/Autotracker.java @@ -21,14 +21,17 @@ import android.view.View; import android.widget.EditText; +import com.growingio.android.sdk.TrackerContext; import com.growingio.android.sdk.autotrack.inject.InjectorProvider; import com.growingio.android.sdk.autotrack.impression.ImpressionProvider; +import com.growingio.android.sdk.autotrack.page.Page; import com.growingio.android.sdk.autotrack.page.PageProvider; import com.growingio.android.sdk.autotrack.page.SuperFragment; import com.growingio.android.sdk.autotrack.view.ViewAttributeUtil; import com.growingio.android.sdk.Tracker; import com.growingio.android.sdk.autotrack.view.ViewNodeProvider; import com.growingio.android.sdk.track.TrackMainThread; +import com.growingio.android.sdk.track.events.TrackEventGenerator; import com.growingio.android.sdk.track.log.Logger; import com.growingio.android.sdk.track.providers.TrackerLifecycleProvider; @@ -55,6 +58,46 @@ protected Map, TrackerLifecycleProvide return providerMap; } + + @Override + public void trackCustomEvent(String eventName) { + if (!isInited) return; + if (TextUtils.isEmpty(eventName)) { + Logger.e(TAG, "trackCustomEvent: eventName is NULL"); + return; + } + trackCustomEvent(eventName, null); + } + + @Override + public void trackCustomEvent(String eventName, Map attributes) { + if (!isInited) return; + if (TextUtils.isEmpty(eventName)) { + Logger.e(TAG, "trackCustomEvent: eventName is NULL"); + return; + } + TrackMainThread.trackMain().runOnUiThread(() -> { + TrackerContext trackerContext = getContext(); + if (trackerContext == null) { + return; + } + AutotrackConfig config = trackerContext.getConfigurationProvider().getConfiguration(AutotrackConfig.class); + if (config == null || !config.isReferCustomEventWithPage()) { + super.trackCustomEvent(eventName, attributes); + return; + } + Page lastPage = PageProvider.get().findLatestPage(); + if (lastPage == null) { + super.trackCustomEvent(eventName, attributes); + return; + } + String path = lastPage.activePath(); + if (path.isEmpty()) path = lastPage.path(); + TrackEventGenerator.generatePageCustomEvent(eventName, attributes, path); + }); + } + + /** * Generate an event for the current page */ diff --git a/growingio-autotracker-core/src/main/java/com/growingio/android/sdk/autotrack/page/PageProvider.java b/growingio-autotracker-core/src/main/java/com/growingio/android/sdk/autotrack/page/PageProvider.java index fec38f7e..8e494850 100644 --- a/growingio-autotracker-core/src/main/java/com/growingio/android/sdk/autotrack/page/PageProvider.java +++ b/growingio-autotracker-core/src/main/java/com/growingio/android/sdk/autotrack/page/PageProvider.java @@ -545,4 +545,21 @@ public Page findPage(View view) { } return null; } + + public Page findLatestPage(){ + if (ALL_PAGE_TREE.isEmpty()) { + return null; + } + Page page = null; + for (ActivityPage activityPage : ALL_PAGE_TREE.values()) { + if (page == null) { + page = activityPage; + } else { + if (activityPage.getShowTimestamp() > page.getShowTimestamp()) { + page = activityPage; + } + } + } + return page; + } } diff --git a/growingio-autotracker-core/src/test/java/com/growingio/android/sdk/autotrack/AutotrackTest.java b/growingio-autotracker-core/src/test/java/com/growingio/android/sdk/autotrack/AutotrackTest.java index 500cf78b..18a3f084 100644 --- a/growingio-autotracker-core/src/test/java/com/growingio/android/sdk/autotrack/AutotrackTest.java +++ b/growingio-autotracker-core/src/test/java/com/growingio/android/sdk/autotrack/AutotrackTest.java @@ -47,7 +47,15 @@ public void setup() { Application application = ApplicationProvider.getApplicationContext(); Map, Configurable> modules = new HashMap<>(); - modules.put(AutotrackConfig.class, new AutotrackConfig().setImpressionScale(0.5f)); + modules.put(AutotrackConfig.class, + new AutotrackConfig().setImpressionScale(0.5f) + .setWebViewBridgeEnabled(true) + .setPageRuleXml(0) + .addPageRule("MainActivity", "com.growingio.android.sdk.autotrack.RobolectricActivity") + .addPageMatchRule(".*") + .enableFragmentTag(false) + + ); TrackerLifecycleProviderFactory.create().createConfigurationProviderWithConfig(new CoreConfiguration("AutotrackTest", "growingio://autotrack"), modules); autotracker = new Autotracker(application); } diff --git a/growingio-data/protobuf/src/main/java/com/growingio/android/protobuf/EventProtocolTransfer.java b/growingio-data/protobuf/src/main/java/com/growingio/android/protobuf/EventProtocolTransfer.java index e5f91072..3263405a 100644 --- a/growingio-data/protobuf/src/main/java/com/growingio/android/protobuf/EventProtocolTransfer.java +++ b/growingio-data/protobuf/src/main/java/com/growingio/android/protobuf/EventProtocolTransfer.java @@ -240,7 +240,9 @@ private static EventV3Protocol.EventV3Dto protocol(GEvent gEvent) { if (gEvent instanceof PageLevelCustomEvent) { PageLevelCustomEvent plEvent = (PageLevelCustomEvent) gEvent; eventBuilder.setPath(plEvent.getPath()); //10 - eventBuilder.setPageShowTimestamp(plEvent.getPageShowTimestamp()); //23 + if (plEvent.getPageShowTimestamp() > 0) { + eventBuilder.setPageShowTimestamp(plEvent.getPageShowTimestamp());//23 + } } if (gEvent instanceof VisitEvent) { VisitEvent visitEvent = (VisitEvent) gEvent; diff --git a/growingio-tracker-core/src/main/java/com/growingio/android/sdk/Tracker.java b/growingio-tracker-core/src/main/java/com/growingio/android/sdk/Tracker.java index 9d219f95..65c3a580 100644 --- a/growingio-tracker-core/src/main/java/com/growingio/android/sdk/Tracker.java +++ b/growingio-tracker-core/src/main/java/com/growingio/android/sdk/Tracker.java @@ -152,7 +152,7 @@ public void trackCustomEvent(String eventName, Map attributes) { if (attributes != null) { attributes = new HashMap<>(attributes); } - TrackEventGenerator.generateCustomEvent(eventName, attributes); + TrackEventGenerator.generatePageCustomEvent(eventName, attributes,"/fake"); } public void setDynamicGeneralPropsGenerator(DynamicGeneralPropsGenerator generator) { diff --git a/growingio-tracker-core/src/main/java/com/growingio/android/sdk/track/events/TrackEventGenerator.java b/growingio-tracker-core/src/main/java/com/growingio/android/sdk/track/events/TrackEventGenerator.java index 5d42a307..a3db1d31 100644 --- a/growingio-tracker-core/src/main/java/com/growingio/android/sdk/track/events/TrackEventGenerator.java +++ b/growingio-tracker-core/src/main/java/com/growingio/android/sdk/track/events/TrackEventGenerator.java @@ -37,6 +37,15 @@ public static void generateCustomEvent(String name, Map attribut ); } + public static void generatePageCustomEvent(String name, Map attributes, String path) { + TrackMainThread.trackMain().postEventToTrackMain( + new PageLevelCustomEvent.Builder() + .setPath(path) + .setEventName(name) + .setAttributes(attributes) + ); + } + public static void generateConversionVariablesEvent(Map variables) { TrackMainThread.trackMain().postEventToTrackMain( new ConversionVariablesEvent.Builder()