Giter Club home page Giter Club logo

tracklytics's Issues

Enabling different keys for debug and release (Suggestion)

In my project we use out source teams and i do not want to share our live API Keys with them so i create 2 different project on Google Console and generate 2 different sets of keys. To enable this with Tracklytics i did this :

  1. Created 2 sets of files
    • for debug which is located under app/src/debug folder
    • for release one level up the git base in a folder named AndroidKeyStore
  2. Generated config files using Google API config file generators and put the files accordingly in these folders
    • "google-services.json"
    • "tracklytics.properties"
  3. In app build.gradle used some tasks and chained them to existing tasks to copy files according to build type to the proper locations.
    • at the end of app build.gradle added
task switchToDebug(type: Copy) {
    description = 'Switches to DEBUG google-services.json'
    from "src/debug"
    include "google-services.json"
    into "."
}

task switchToRelease(type: Copy) {
    description = 'Switches to RELEASE google-services.json'
    from "../.."
    include "google-services.json"
    into "."
}

task prepareTracklyticsDebug(type: Copy) {
    description = 'Copies Tracklytics keys for Debug'
    from "src/debug"
    include "tracklytics.properties"
    into "../"
}

task prepareTracklyticsRelease(type: Copy) {
    description = 'Copies Tracklytics keys for Release'
    from "../../AndroidKeyStore"
    include "tracklytics.properties"
    into "../"
}
afterEvaluate {
    processDebugGoogleServices.dependsOn switchToDebug
    processReleaseGoogleServices.dependsOn switchToRelease

    if (build.properties.debuggable) {
        prepareComOrhanobutTracklyticsTracklyticsRuntime013Library.dependsOn prepareTracklyticsDebug
    } else {
        prepareComOrhanobutTracklyticsTracklyticsRuntime013Library.dependsOn prepareTracklyticsRelease
    }
}

Result :

I used build.properties.debuggable and set it false for release buildType and true for debug buildType because i could not see different tasks for release and debug in build log. It may be good if there are seperate tasks as " processDebugGoogleServices & processReleaseGoogleServices " in addition to / instead of prepareComOrhanobutTracklyticsTracklyticsRuntime013Library . Or they exists and i could not see :(

I am not a master so i am very open to change the way i did it if this is not the way to do these kind of stuff.

Doesn't work with classpath 'com.android.tools.build:gradle:3.3.0'

Doesn't work with classpath com.android.tools.build:gradle:3.3.0
the error occurs during Sync of project

org.gradle.api.ProjectConfigurationException: A problem occurred configuring project ':app'.
	at org.gradle.configuration.project.LifecycleProjectEvaluator.wrapException(LifecycleProjectEvaluator.java:79)
	at org.gradle.configuration.project.LifecycleProjectEvaluator.addConfigurationFailure(LifecycleProjectEvaluator.java:73)
	at org.gradle.configuration.project.LifecycleProjectEvaluator.access$400(LifecycleProjectEvaluator.java:54)
	at org.gradle.configuration.project.LifecycleProjectEvaluator$NotifyAfterEvaluate.run(LifecycleProjectEvaluator.java:200)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.configuration.project.LifecycleProjectEvaluator$EvaluateProject.run(LifecycleProjectEvaluator.java:110)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:68)
	at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:687)
	at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:140)
	at org.gradle.execution.TaskPathProjectEvaluator.configure(TaskPathProjectEvaluator.java:35)
	at org.gradle.execution.TaskPathProjectEvaluator.configureHierarchy(TaskPathProjectEvaluator.java:62)
	at org.gradle.configuration.DefaultBuildConfigurer.configure(DefaultBuildConfigurer.java:41)
	at org.gradle.initialization.DefaultGradleLauncher$ConfigureBuild.run(DefaultGradleLauncher.java:274)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.initialization.DefaultGradleLauncher.configureBuild(DefaultGradleLauncher.java:182)
	at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:141)
	at org.gradle.initialization.DefaultGradleLauncher.getConfiguredBuild(DefaultGradleLauncher.java:119)
	at org.gradle.internal.invocation.GradleBuildController$2.call(GradleBuildController.java:86)
	at org.gradle.internal.invocation.GradleBuildController$2.call(GradleBuildController.java:83)
	at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:154)
	at org.gradle.internal.work.StopShieldingWorkerLeaseService.withLocks(StopShieldingWorkerLeaseService.java:38)
	at org.gradle.internal.invocation.GradleBuildController.doBuild(GradleBuildController.java:96)
	at org.gradle.internal.invocation.GradleBuildController.configure(GradleBuildController.java:83)
	at org.gradle.tooling.internal.provider.runner.ClientProvidedBuildActionRunner.run(ClientProvidedBuildActionRunner.java:70)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.tooling.internal.provider.ValidatingBuildActionRunner.run(ValidatingBuildActionRunner.java:32)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.run(RunAsBuildOperationBuildActionRunner.java:50)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:45)
	at org.gradle.tooling.internal.provider.SubscribableBuildActionRunner.run(SubscribableBuildActionRunner.java:51)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:47)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:44)
	at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:79)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:44)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:30)
	at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:39)
	at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:25)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:80)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:53)
	at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:62)
	at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:34)
	at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:36)
	at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:25)
	at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:43)
	at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:29)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:59)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:31)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:59)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:44)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:46)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:30)
	at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
	at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
	at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
	at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
	at org.gradle.util.Swapper.swap(Swapper.java:38)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
	at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
	at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:62)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
	at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:81)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:122)
	at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
	at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:295)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
	at java.lang.Thread.run(Thread.java:748)
Caused by: org.gradle.internal.event.ListenerNotificationException: Failed to notify project evaluation listener.
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:86)
	at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:324)
	at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:234)
	at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:140)
	at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:37)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
	at com.sun.proxy.$Proxy30.afterEvaluate(Unknown Source)
	at org.gradle.configuration.project.LifecycleProjectEvaluator$NotifyAfterEvaluate$1.execute(LifecycleProjectEvaluator.java:187)
	at org.gradle.configuration.project.LifecycleProjectEvaluator$NotifyAfterEvaluate$1.execute(LifecycleProjectEvaluator.java:184)
	at org.gradle.api.internal.project.DefaultProject.stepEvaluationListener(DefaultProject.java:1418)
	at org.gradle.configuration.project.LifecycleProjectEvaluator$NotifyAfterEvaluate.run(LifecycleProjectEvaluator.java:193)
	... 95 more
Caused by: org.gradle.api.InvalidUserCodeException: Cannot create variant 'android-manifest-metadata' after configuration ':app:qaApiElements' has been resolved
	at org.gradle.api.internal.artifacts.configurations.DefaultConfigurationPublications$ConfigurationVariantFactory.create(DefaultConfigurationPublications.java:194)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfigurationPublications$ConfigurationVariantFactory.create(DefaultConfigurationPublications.java:188)
	at org.gradle.api.internal.FactoryNamedDomainObjectContainer.doCreate(FactoryNamedDomainObjectContainer.java:100)
	at org.gradle.api.internal.AbstractNamedDomainObjectContainer.create(AbstractNamedDomainObjectContainer.java:72)
	at com.android.build.gradle.internal.scope.ArtifactPublishingUtil$publishArtifactToConfiguration$1.execute(ArtifactPublishingUtil.kt:47)
	at com.android.build.gradle.internal.scope.ArtifactPublishingUtil$publishArtifactToConfiguration$1.execute(ArtifactPublishingUtil.kt)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfigurationPublications.variants(DefaultConfigurationPublications.java:158)
	at com.android.build.gradle.internal.scope.ArtifactPublishingUtil.publishArtifactToConfiguration(ArtifactPublishingUtil.kt:46)
	at com.android.build.gradle.internal.scope.ArtifactPublishingUtil.publishArtifactToConfiguration$default(ArtifactPublishingUtil.kt:41)
	at com.android.build.gradle.internal.scope.ArtifactPublishingUtil.publishArtifactToConfiguration(ArtifactPublishingUtil.kt)
	at com.android.build.gradle.internal.scope.VariantScopeImpl.publishIntermediateArtifact(VariantScopeImpl.java:233)
	at com.android.build.gradle.internal.VariantManager.publishBuildArtifacts(VariantManager.java:516)
	at com.android.build.gradle.BasePlugin.createAndroidTasks(BasePlugin.java:809)
	at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:81)
	at com.android.build.gradle.BasePlugin.lambda$createTasks$4(BasePlugin.java:651)
	at com.android.build.gradle.internal.crash.CrashReporting$afterEvaluate$1.execute(crash_reporting.kt:37)
	at com.android.build.gradle.internal.crash.CrashReporting$afterEvaluate$1.execute(crash_reporting.kt)
	at org.gradle.configuration.internal.DefaultListenerBuildOperationDecorator$BuildOperationEmittingAction$1$1.run(DefaultListenerBuildOperationDecorator.java:155)
	at org.gradle.configuration.internal.DefaultUserCodeApplicationContext.reapply(DefaultUserCodeApplicationContext.java:58)
	at org.gradle.configuration.internal.DefaultListenerBuildOperationDecorator$BuildOperationEmittingAction$1.run(DefaultListenerBuildOperationDecorator.java:152)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
	at org.gradle.configuration.internal.DefaultListenerBuildOperationDecorator$BuildOperationEmittingAction.execute(DefaultListenerBuildOperationDecorator.java:149)
	at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:91)
	at org.gradle.internal.event.BroadcastDispatch$ActionInvocationHandler.dispatch(BroadcastDispatch.java:80)
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:42)
	at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:230)
	at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:149)
	at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:58)
	... 105 more

ACRA Integration

Lovely library but an issue that I and I assume a growing number of developers are using
another open source (and personally I think a great library) ACRA. Do you have any plans to integrate with it or extend it?

My hope is to force providers to utilize a single open source library as the interface to tracking/analytics for them all instead of polluting our code as you said.

Tracklytics with Jack compiler

Will this library work if used with Jack compiler?

I did a quick test and it didn't work, is there any plans to make this compatible with Jack?

Could not be able to use library

I have used below code to my app/gradle file

buildscript {
  dependencies {
    classpath 'com.orhanobut.tracklytics:tracklytics-plugin:2.0.0'
  }
}

apply plugin: 'com.android.application'
apply plugin: 'com.orhanobut.tracklytics' 

but .I am getting below error

Error:Could not find com.orhanobut.tracklytics:tracklytics-plugin:2.0.0.
Searched in the following locations:
file:/Applications/Android Studio.app/Contents/gradle/m2repository/com/orhanobut/tracklytics/tracklytics-plugin/2.0.0/tracklytics-plugin-2.0.0.pom
file:/Applications/Android Studio.app/Contents/gradle/m2repository/com/orhanobut/tracklytics/tracklytics-plugin/2.0.0/tracklytics-plugin-2.0.0.jar
Required by:
project :app

Add prettyprint option for logging

Problem

Current long might be too long and might be not readable, especially when the developer is interested in details.

[0+0=0ms] Screen Displayed-> {Screen Name=Login, Key=very very long value}, super attrs: {User Id: 324234234}, filters: [100] 

Pretty print option

Log output should be easily readable. I don't have any clear idea right now but this issue should be a kick-off for this idea.

How to initialize (Question)

Hi,

Again another great idea and library 👍

What should be written to :

   new GoogleAnalyticsTrackingAdapter(this, "CONTAINER_ID", R.raw.container);

King regards

Track screen load duration

Problem

Sometimes you may need to determine the elapsed time for a specific event. For example: Screen load time between onResume and onCreate

Proposition

Add a track timer annotation to start point with a key. Key will be used to differentiate different timer points. Thus multiple timer start point can be used. And used a specific annotation to add the attribute which gets the attribute key and the timer to determine elapsed time.

@TrackTimer("timer_id")
public void onCreate() {}

@TrackEvent("Event name")
@TrackAttribute(key="attribute", timer="timer_id")
public void onResume(){}

onResume will have an attribute which is called "attribute" and the value will be elapsed time between onCreate and onTime.

Elapsed time should use milliseconds for unit.

Error:(15, 0) Gradle DSL method not found: 'compile()'

can you help me please

Error:(15, 0) Gradle DSL method not found: 'compile()'
Possible causes:

  • The project 'worcipe' may be using a version of Gradle that does not contain the method.
    Open Gradle wrapper file
  • The build file may be missing a Gradle plugin.
    Apply Gradle plugin
    • build.gradle (project: worcipe)

    // Top-level build file where you can add configuration options common to all sub-projects/modules.

    buildscript {
    repositories {
    jcenter()
    maven { url "https://jitpack.io" }
    }
    dependencies {
    classpath 'com.android.tools.build:gradle:1.5.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
       // ... other dependencies here
    
        compile('com.github.afollestad.material-dialogs:core:0.8.5.1@aar') {
            transitive = true
        }
    }
    

    }

    allprojects {
    repositories {
    jcenter()
    }
    }

    • build.gradle (Modul: app)

    apply plugin: 'com.android.application'

    android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"
    defaultConfig {
    applicationId "com.gabriel.workoutrecipes"
    minSdkVersion 15
    targetSdkVersion 23
    versionCode 1
    versionName "1.0"
    }
    buildTypes {
    release {
    minifyEnabled false
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    }
    productFlavors {
    }
    }

    dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile('com.mikepenz:materialdrawer:4.6.1@aar') {
    transitive = true
    }
    compile 'com.android.support:appcompat-v7:22.2.1'
    compile 'com.android.support:design:24.0.0-alpha2'
    compile 'com.github.rey5137:material:1.2.2'
    compile 'com.afollestad:material-dialogs:0.7.9.1'
    compile 'se.emilsjolander:StickyScrollViewItems:1.1.0'
    compile 'com.melnykov:floatingactionbutton:1.3.0'
    compile 'com.android.support:cardview-v7:24.0.0-alpha2'
    compile 'com.android.support:recyclerview-v7:24.0.0-alpha2'
    compile 'com.etsy.android.grid:library:1.0.5'
    compile 'com.google.android.gms:play-services-ads:8.4.0'
    compile 'com.google.android.gms:play-services-analytics:8.4.0'
    }

Tracklytics new feature propositions

No tracker implementations

  • Implementation should be up to the client, there are many different trackers and each can be used differently.
  • Remove fabric and mixpanel
  • Provide more flexible public interface for clients to be able to add any tracker they want easily. (Current implementation is good enough though). Signature can be a little different.

Attribute

Scope: Method, Parameter
Use Attribute to add attributes with dynamic values. There are 2 ways to set this value.

  1. A return value from the method
  2. Method parameter which is passed via method.

Both option accepts null

@Attribute("key") String someMethod(){
   return "value";
}

void someMethod(@Attribute("key") String value){
}

@Attribute("key1") void someMethod(@Attribute("key2") String value1){
   return "value2"
}

Attribute also has a default value option. When the expected value is null, default value will be used

@Attribute(value = "key", defaultValue="value") String someMethod(){
   return null";
}

FixedAttribute

Scope: Class, Method
Use it to add fixed values for the attributes

@FixedAttribute(key="Screen Name", value="Login")
public class LoginActivity {

  @FixedAttribute(key="key", value="value") public void foo(){
  }
}

FixedAttributes

Scope: Class, Method
Use it to add multiple attributes at once. Java 7 or lower API's don't support repeated annotations.

@FixedAttributes({
  @FixedAttribute(key="key1", value="value1"),
  @FixedAttribute(key="key2", value="value2")
})
public void foo(){
}

Super attributes

Sometimes, you may need to have an application scope attribute and you may want to have this attribute for each event.
Attribute and FixedAttribute have an option to make the attribute super. As default it is false, thereby enabling this flag will make the attribute super and it will kept in memory in entire time.

@Attribute(key="key", isSuper=true)
//or
@FixedAttribute(key="key", value="value", isSuper=true)

Deprecated

  • Track

Configuration of Proguard

if I use the proguard, which part of code of tracklytics should I keep?

-keep class com.orhanobut.tracklytics.** { ; }
-keep interface com.orhanobut.tracklytics.* { ; }
-dontwarn com.orhanobut.tracklytics.*

this configuration doesn't work on my project.

Doesn't work with proguard

My method:

    @TrackEvent("SELECT_CONTENT")
    private fun selectItem(@TrackableAttribute item: MyItem) {
       ...
    }

Error:

 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Class java.lang.reflect.Method.getDeclaringClass()' on a null object reference
        at com.orhanobut.tracklytics.TracklyticsAspect.addClassAttributes(SourceFile:119)
        at com.orhanobut.tracklytics.TracklyticsAspect.weaveJoinPointTrackEvent(SourceFile:104)

Simple sample project would be great (Suggestion)

@orhanobut first thing first, great library 💯 :)

I am pretty new to github stuff (dont believe even my profile says other wise :)) so i am writing here my suggestion which i believe will increase the user number of library.

it would be great if you can share a simple sample project which contains :

  • tracking of page view, 2 different pages would be more than enough
  • tracking of button clicks, 2 different buttons would be more than enough
  • integrated with Google Analytics (contains key placeholders)
  • integrated with Fabric (contains key placeholders)
    I know it seems nothing but will be very very helpful for many newbies like me and fastens the on boarding process ;)

King Regards

Unable to include in the project

Hi,

Can you help me solve this ?

Error:Could not find com.orhanobut.tracklytics:tracklytics-plugin:0.10.
Searched in the following locations:
    file:/Applications/Android Studio.app/Contents/gradle/m2repository/com/orhanobut/tracklytics/tracklytics-plugin/0.10/tracklytics-plugin-0.10.pom
    file:/Applications/Android Studio.app/Contents/gradle/m2repository/com/orhanobut/tracklytics/tracklytics-plugin/0.10/tracklytics-plugin-0.10.jar
    https://maven.fabric.io/public/com/orhanobut/tracklytics/tracklytics-plugin/0.10/tracklytics-plugin-0.10.pom
    https://maven.fabric.io/public/com/orhanobut/tracklytics/tracklytics-plugin/0.10/tracklytics-plugin-0.10.jar
Required by:

Thanks!
Manju

Adobe Analytics

Hello,
Nice library. Do you think like adopting Adobe Analytics to this library?
And if Yes , do you accept contributors?

Track event without annotation

First things first thanks for the library 👍

My problem is, i don't want to refactor my method just to add Attributes and will not be used in the method itself.

Maybe in my use case i just want to use the annotation for the fixed attribute event.

Is it possible to track event from the Tracker? Thanks before

Not entering in EventSubscriber or EventLogListener

I've followed the sample code, and downloaded it too, but onEventTracked is never called.
The way I found it to work is to use tracklytics.trackEvent (String eventName, Map Attributes), but did not want to do it that way.

Set minifyEnabled to true in release mode causes Exception

hi,
Firstly it is a really cool library. Congrats on that.
But your sample app crashes when minifyEnabled option to true. I believe proguard is causing this exception. I have added this library in my app , same exception occurs when minifyenabled to true. So please give proguard flags to avoid this exception.

i should set minifyEnabled to true to reduce the apk size.

Kotlin support

No error with compilation but this does not work with Kotlin.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.