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.