WinAnalytics

Additional

Language
Kotlin
Version
v1.0.0 (Feb 9, 2019)
Created
Oct 7, 2018
Updated
Feb 8, 2019 (Retired)
Owner
Winfooz
Contributor
Mohamed Hamdan (winfoozmnayef)
1
Activity
Badge
Generate
Download
Source code

WinAnalytics library

A light-weight android library that can be quickly integrated into any app to use analytics tools.

  • Custom adapters for support all analytical tools.
  • Annotations based.
  • Support Retrofit calls for log events automatically.
  • Support log events when user clicks on views.
  • Support screens events.
  • Null safety.

Contributing:

If you'd like to contribute, please take a look at the Contributing page on the Wiki.

Example WinAnalytics:

Application class

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        WinConfiguration configuration = WinConfiguration.builder()
                .registerAdapter(new MixpanelAdapter(this, "token"))
                .registerAdapter(new FirebaseAdapter(this))
                .registerAdapter(new FabricAdapter(this))
                ...
                .debugMode(BuildConfig.DEBUG)
                .build();
        WinAnalytics.init(configuration);
    }
}

Analytics interfaces

@Analytics(
        events = {
                @Data(value = @Value("post.title"), key = @Key("title")),
                @Data(value = @Value("post.body"), key = @Key("body"))
        },
        timestamp = true
)
public interface MainActivityAnalytics {

    // This event will override class @Analytics events
    @Event(
            value = "Success get posts",
            events = {
                    @Data(value = @Value("post.title"), key = @Key("title")),
                    @Data(value = @Value("otherParam"), key = @Key("otherParam"))
            }
    )
    void successGetPosts(Post post, String otherParam);

    // This event will inherit values from class @Analytics annotation
    @Event(value = "Failed get posts")
    void failedGetPosts(Post post);

    // This event will inherit values from class @Analytics annotation
    @Event(value = "Failed get posts1")
    void failed1GetPosts(Post post);
}

Analytics wrapper

@AnalyticsWrapper
public interface MyAnalyticsWrapper {

    // This method will be return MainActivityAnalytics implementation
    MainActivityAnalytics mainActivityAnalytics();
}

Access MyAnalyticsWrapper

public class MainActivity extends AppCompatActivity {

    private JavaMyAnalyticsWrapper wrapper;
    private JavaMainActivityAnalytics mainActivityAnalytics;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        wrapper = WinAnalytics.create(JavaMyAnalyticsWrapper.class);
        mainActivityAnalytics = wrapper.mainActivityAnalytics();

        Post post = new Post();
        post.setTitle("title");
        post.setBody("body");

        mainActivityAnalytics.failedGetPosts(post);
    }
}

Example analytics when user clicks on button:

Analytics interface

@Analytics
public interface JavaMainActivityAnalytics {

    @Event(
            value = "Failed get posts",
            events = {
                    @Data(value = @Value("post.title"), key = @Key("title"))
            },
            timestamp = true
    )
    void failedGetPosts(/* This name for WinAnalytics know whitch object will bind here */ @Name("post") Post post);
}

MainActivity

public class MainActivity extends AppCompatActivity {

    private Destroyable destroyable;

    @Name("post")
    @Bind(R.id.btn_login)
    Post post;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Don't forget add this line to bind clicks listeners to views
        destroyable = WinAnalytics.bind(this);
    }

    @EventOnClick(value = R.id.btn_login, event = "Failed get posts")
    void onLoginClicked() {
        // Do what you want here after user clicks on button and WinAnalytics will log event automatically for you
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        destroyable.destroy();
    }
}

Network analytics

What if you want log events based on retrofit call success or failure, WinAnalytics already supports this type of analytics.

Http client

public interface HttpClient {

    // This for tell WinAnalytisc this call supports analytics
    @AnalyticsCall
    @GET("posts")
    Call<List<Post>> getPosts();
}

then after add @Analytics for your call you need to specify what event you want to call when this call response success or failure

Analytics interface

@Analytics
public interface JavaMainActivityAnalytics {

    // That means this analyics will fire after "posts" api response success and "name" means you should use call arguments which named with "getPostsSuccess"
    @CallSuccess(value = "posts", name = "getPostsSuccess")
    @Event(
            value = "Failed get posts",
            events = {
                    @Data(value = @Value("post.title"), key = @Key("title"))
            },
            timestamp = true
    )
    void failedGetPosts(@Name("post") Post post);
}

Now in your activity or whatever you want to log events you need to add this code.

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    // value means your api, and names means name whitch you specifyed in `@CallSuccess`
    @CallArgument(value = {"posts"}, names = "getPostsSuccess")
    Post post;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // You need register and unregister your call arguments and binds
        WinAnalytics.getInstance().register(this);

        findViewById(R.id.btn_login2).setOnClickListener(this);
    }

    // this method will return api response for log initialize your variable before log event
    @BindCallArguments(value = {"posts"})
    void init(Response<List<Post>> response) {
        post = response.body().get(0);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        WinAnalytics.getInstance().unregister(this);
    }

    @Override
    public void onClick(View v) {
        HttpHelper.getHttpClient().getPosts().enqueue(new Callback<List<Post>>() {
            @Override
            public void onResponse(@NonNull Call<List<Post>> call, @NonNull Response<List<Post>> response) {
                // Do what you want after response and let WinAnalytics log network events for you
            }

            @Override
            public void onFailure(@NonNull Call<List<Post>> call, @NonNull Throwable t) {
            }
        });
    }
}

The last thing you want to add is indexing interface like this

@AnalyticsIndex
public interface MyAnalyticsIndex { }

Now WinAnalytics will log events automatically for you in a background thread, But you need to register WinAnalytics call adapter factory when you initialize retrofit like this

public static HttpClient getHttpClient() {
    return new Retrofit.Builder()
        .addConverterFactory(GsonConverterFactory.create())
        .addCallAdapterFactory(new AnalyticsFactory(BASE_URL))
        .baseUrl(BASE_URL)
        .build()
        .create(HttpClient.class);
}

Log screens opens events

For log screen events you just want to annotate your class with @Screen like this

@Screen(value = "Main activity", timestamp = true)
public class JavaMainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Don't forget to add this line for log event and bind other cliks if you have.
        WinAnalytics.bind(this);
    }
}

Download

dependencies {
    // if you want log retroift calls events you need to add this dependency
    implementation 'com.winfooz:winanalytics-retroft:1.0.0'

    // but if you want just log clicks events or manually events you need to add this dependency
    implementation 'com.winfooz:winanalytics:1.0.0'

    // Always you need to add this dependency.
    kapt 'com.winfooz:winanalytics-compiler:1.0.0'
    
    // If you want use firebase analytics
    implementation 'com.winfooz:adapter-firebase:1.0.0'
    
    // If you want use mixpanel analytics
    implementation 'com.winfooz:adapter-mixpanel:1.0.0'
}

Support annotations

@Analytics
@AnalyticsCall
@AnalyticsIndex
@AnalyticsWrapper
@Bind
@BindCallArguments
@CallArgument
@CallFailure
@CallSuccess
@Event
@EventOnClick
@Name
@Screen

License

WinAnalytics is released under the MIT license. See LICENSE for details.