Android Example App
A comprehensive Android TicTacToe application demonstrating all Trackier SDK features with complete implementation examples.
Overview
The TicTacToe Android Example is a fully functional Android app that showcases:
- Complete SDK Integration - All Trackier SDK features implemented
- Real-world Examples - Production-ready Java code patterns
- Game-based Implementation - Practical use cases in a TicTacToe game
- Comprehensive Logging - Detailed debugging information
- Firebase Integration - Uninstall tracking with Firebase Analytics
Key Features Demonstrated
SDK Initialization
Complete setup with development environment configuration and deep link listener setup.
Event Tracking
- App Launch Events - Track when the app is opened
- Game Events - Track player wins and game outcomes
- Invite Events - Track when users invite friends
- Uninstall Tracking - Firebase Analytics integration for uninstall detection
Deep Linking
- Comprehensive Logging - Complete deep link data extraction
- Parameter Extraction - Parse and log all deep link parameters
- Deferred Deep Links - Handle post-install attribution
- URL Resolution - Resolve deferred deep link URLs
Dynamic Links
- Link Creation - Template-based generation with full configuration
- Sharing Integration - Native Android sharing functionality
- Error Handling - Proper error logging and user feedback
- Event Tracking - Track invite events when links are created
Repository Structure
example_tictactoe_android/
├── app/
│ ├── src/main/java/com/cloudstuff/tictactoe/
│ │ ├── TicTacToe.java # Application class with SDK initialization
│ │ ├── activity/
│ │ │ ├── MainActivity.java # Main activity with deep link handling
│ │ │ └── SplashActivity.java # Splash screen with app launch event
│ │ └── fragment/
│ │ ├── GameFragment.java # Game logic with win event tracking
│ │ └── SettingsFragment.java # Settings with dynamic link creation
│ ├── build.gradle # Dependencies and build configuration
│ └── proguard-rules.pro # ProGuard rules for SDK
├── build.gradle # Project build configuration
└── gradle.properties # Gradle properties
Quick Start
1. Clone the Repository
git clone https://github.com/ApptroveLabs/example_tictactoe_android.git
cd example_tictactoe_android
2. Configure SDK Key
Update the SDK key in app/src/main/java/com/cloudstuff/tictactoe/TicTacToe.java:
private static final String TR_DEV_KEY = "your-sdk-key-here";
3. Configure Template ID
Update the template ID in app/src/main/java/com/cloudstuff/tictactoe/fragment/SettingsFragment.java:
.setTemplateId("your-template-id-here")
4. Build and Run
./gradlew assembleDebug
./gradlew installDebug
Implementation Examples
SDK Initialization
// TicTacToe.java - Application class
public class TicTacToe extends Application {
private static final String TR_DEV_KEY = "<PLACE_SDK_OR_APP_KEY_HERE>";
@Override
public void onCreate() {
super.onCreate();
// SDK Configuration
TrackierSDKConfig sdkConfig = new TrackierSDKConfig(this, TR_DEV_KEY, "development");
sdkConfig.setDeepLinkListener(deepLinkListener);
TrackierSDK.initialize(sdkConfig);
}
// Deep link listener for comprehensive logging
DeepLinkListener deepLinkListener = new DeepLinkListener() {
public void onDeepLinking(@NonNull DeepLink deepLink) {
Log.d("DeepLink", "=== Deep Link Received ===");
Log.d("DeepLink", "Deep Link Value: " + deepLink.getDeepLinkValue());
Log.d("DeepLink", "URL: " + deepLink.getUrl());
Log.d("DeepLink", "Is Deferred: " + deepLink.isDeferred());
Log.d("DeepLink", "Partner ID: " + deepLink.getPartnerId());
Log.d("DeepLink", "Site ID: " + deepLink.getSiteId());
Log.d("DeepLink", "Campaign: " + deepLink.getCampaign());
Log.d("DeepLink", "P1: " + deepLink.getP1());
Log.d("DeepLink", "P2: " + deepLink.getP2());
Log.d("DeepLink", "P3: " + deepLink.getP3());
Log.d("DeepLink", "P4: " + deepLink.getP4());
Log.d("DeepLink", "P5: " + deepLink.getP5());
Log.d("DeepLink", "All Data: " + deepLink.getData());
if (deepLink.getSdkParams() != null) {
Log.d("DeepLink", "SDK Params: " + deepLink.getSdkParams());
}
Log.d("DeepLink", "=== End Deep Link Info ===");
}
};
}
Event Tracking
// App Launch Event - SplashActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
TrackierEvent event = new TrackierEvent("sEMWSCTXeu");
event.param1 = "Param1";
TrackierSDK.trackEvent(event);
}
// Game Win Event - GameFragment.java
private void trackPlayerWin(String player) {
TrackierEvent event = new TrackierEvent("ErkEjPi4X1");
event.param1 = player + " won";
TrackierSDK.trackEvent(event);
}
// Invite Friends Event - SettingsFragment.java
private void trackInviteEvent() {
TrackierEvent event = new TrackierEvent(TrackierEvent.INVITE);
event.param1 = "Settings Screen";
event.param2 = "Invite Button Clicked";
TrackierSDK.trackEvent(event);
}
// Uninstall Tracking - MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FirebaseAnalytics mFirebaseAnalytics = FirebaseAnalytics.getInstance(this);
mFirebaseAnalytics.setUserProperty("ct_objectId", Objects.requireNonNull(TrackierSDK.getTrackierId()));
Log.d("TAG", "onCreate: " + TrackierSDK.getTrackierId());
}
Deep Link Handling
// Deep Link Parameter Extraction - MainActivity.java
private Map<String,String> getDeepLinkParams(Uri uri) {
Map<String,String> deepLinkParams = new HashMap<String,String>();
if(uri != null){
Set<String> paramNames = uri.getQueryParameterNames();
for(String name : paramNames){
deepLinkParams.put(name,uri.getQueryParameter(name));
}
}
return deepLinkParams;
}
// Deferred Deep Link Resolution - MainActivity.java
TrackierSDK.resolveDeeplinkUrl("https://trackier58.u9ilnk.me/d/NKmWH9E7b1",
resultUrl -> {
Log.d("TrackierSDK", "Resolved Deferred Deep Link URL: " + resultUrl);
return null;
},
error -> {
Log.e("TrackierSDK", "Error resolving deferred deep link: " + error.getMessage());
return null;
}
);
Dynamic Link Creation
// SettingsFragment.java
private void createDynamicLink(Context context) {
// Build the dynamic link parameters
Map<String, String> sdkParams = new HashMap<>();
sdkParams.put("param1", "value1");
sdkParams.put("param2", "value2");
DynamicLink dynamicLink = new DynamicLink.Builder()
.setTemplateId("78R2J2") // Set the template ID for the link
.setLink(Uri.parse("https://trackier58.u9ilnk.me")) // The base link
.setDomainUriPrefix("trackier59.unilink.me") // Domain prefix for the link
.setDeepLinkValue("NewMainActivity") // Deep link destination within the app
// Additional SDK parameters
.setSDKParameters(sdkParams)
// Attribution parameters for tracking
.setAttributionParameters(
"my_channel",
"my_campaign",
"at_invite",
"param1_value",
"param2_value",
"param3_value",
"param4_value",
"param5_value"
)
.build();
// Call the SDK to create the dynamic link
TrackierSDK.createDynamicLink(
dynamicLink,
dynamicLinkUrl -> {
// Log success messages
Log.d("DynamicLinkSuccess", "Dynamic link created: " + dynamicLinkUrl);
// Track the invite event
TrackierEvent event = new TrackierEvent(TrackierEvent.INVITE);
event.param1 = "Settings Screen";
event.param2 = "Invite Button Clicked";
TrackierSDK.trackEvent(event);
// Share the dynamic link
shareDynamicLink(dynamicLinkUrl);
return null;
},
errorMessage -> {
// Log error messages
Log.d("DynamicLinkError", errorMessage);
showError("Failed to create invite link. Please try again.");
return null;
}
);
}
// Share Dynamic Link Function
private void shareDynamicLink(String dynamicLinkUrl) {
try {
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(Intent.EXTRA_SUBJECT, "Invite to Tic Tac Toe");
shareIntent.putExtra(Intent.EXTRA_TEXT, "Hey! Check out this awesome Tic Tac Toe game: " + dynamicLinkUrl);
startActivity(Intent.createChooser(shareIntent, "Share via"));
} catch (Exception e) {
Log.e("ShareError", "Error sharing dynamic link: " + e.getMessage());
showError("Failed to share invite link.");
}
}
Testing Features
App Launch Testing
- Launch the app
- Check Logcat for "sEMWSCTXeu" event
- Verify uninstall tracking setup in Firebase Analytics
Game Event Testing
- Play a game of TicTacToe
- Win the game
- Check Logcat for "ErkEjPi4X1" event with win details
Deep Link Testing
- Use test URL:
https://trackier58.u9ilnk.me/d/NKmWH9E7b1 - Check Logcat for comprehensive deep link data logging
- Verify parameter extraction and logging
Dynamic Link Testing
- Navigate to Settings screen
- Click "Invite Friends" button
- Check Logcat for dynamic link creation success
- Verify sharing functionality works
Platform Support
Android
- ✅ Deep Link Handling - Comprehensive logging and parameter extraction
- ✅ Event Tracking - Multiple events across different app sections
- ✅ Dynamic Link Creation - Full invite functionality with sharing
- ✅ Firebase Analytics - Uninstall tracking integration
- ✅ Native Sharing - Android Intent-based sharing
Dependencies
Core Dependencies
// app/build.gradle
dependencies {
implementation 'com.trackier:android-sdk:1.6.73'
implementation 'com.google.firebase:firebase-analytics:21.5.0'
}
ProGuard Rules
# app/proguard-rules.pro
-keep class com.trackier.sdk.** { *; }
Event Summary
| Event ID | Event Name | Location | Trigger |
|---|---|---|---|
| sEMWSCTXeu | App Launch | SplashActivity | App opened |
| ErkEjPi4X1 | Game Win | GameFragment | Player wins game |
| TrackierEvent.INVITE | Invite Friends | SettingsFragment | Invite button clicked |
| TrackierSDK.getTrackierId() | Uninstall Tracking | MainActivity | App launched (Firebase Analytics) |
Logging and Debugging
Log Tags Used
"DeepLink"- Deep link data logging"TrackierSDK"- SDK operations logging"DynamicLinkSuccess"- Dynamic link creation success"DynamicLinkError"- Dynamic link creation errors"ShareError"- Share functionality errors
Key Log Messages
- Deep Link Received: Complete deep link data dump
- Resolved Deferred Deep Link: URL resolution results
- Dynamic Link Created: Successfully created dynamic links
- Event Tracking: All tracked events with parameters
Console Output Examples
D/DeepLink: === Deep Link Received ===
D/DeepLink: Deep Link Value: NewMainActivity
D/DeepLink: URL: https://trackier58.u9ilnk.me/d/NKmWH9E7b1
D/DeepLink: Is Deferred: true
D/DeepLink: Partner ID: 12345
D/DeepLink: Site ID: 67890
D/DeepLink: Campaign: summer_sale
D/DeepLink: P1: param1_value
D/DeepLink: P2: param2_value
D/DeepLink: All Data: {campaign=summer_sale, p1=param1_value, p2=param2_value}
D/DeepLink: === End Deep Link Info ===
D/DynamicLinkSuccess: Dynamic link created: https://trackier59.unilink.me/d/abc123
D/TrackierSDK: Resolved Deferred Deep Link URL: https://trackier58.u9ilnk.me/d/NKmWH9E7b1
Troubleshooting
Common Issues
SDK Not Initializing
- Verify SDK key in
TicTacToe.java - Check Logcat for initialization errors
- Ensure proper import statements
Deep Links Not Working
- Verify URL format and parameters
- Check Logcat for deep link listener logs
- Test with provided sample URLs
Events Not Tracking
- Verify event IDs from Trackier panel
- Check network connectivity
- Monitor Logcat for event tracking logs
Dynamic Links Not Creating
- Verify template ID in settings
- Check network connectivity
- Monitor Logcat for dynamic link creation errors
Firebase Analytics Issues
- Ensure
google-services.jsonis present - Check Firebase project configuration
- Verify Firebase Analytics dependency
Support
For technical support and questions:
- Support Email: support@trackier.com
- GitHub Issues: Create an issue in the repository
This example app provides comprehensive tracking, deep linking, and dynamic link functionality for Android applications using the Trackier SDK, demonstrating best practices for mobile app analytics and attribution with a practical TicTacToe game implementation.