Skip to main content

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
  • 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 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;
}
);
// 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

  1. Launch the app
  2. Check Logcat for "sEMWSCTXeu" event
  3. Verify uninstall tracking setup in Firebase Analytics

Game Event Testing

  1. Play a game of TicTacToe
  2. Win the game
  3. Check Logcat for "ErkEjPi4X1" event with win details
  1. Use test URL: https://trackier58.u9ilnk.me/d/NKmWH9E7b1
  2. Check Logcat for comprehensive deep link data logging
  3. Verify parameter extraction and logging
  1. Navigate to Settings screen
  2. Click "Invite Friends" button
  3. Check Logcat for dynamic link creation success
  4. 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 IDEvent NameLocationTrigger
sEMWSCTXeuApp LaunchSplashActivityApp opened
ErkEjPi4X1Game WinGameFragmentPlayer wins game
TrackierEvent.INVITEInvite FriendsSettingsFragmentInvite button clicked
TrackierSDK.getTrackierId()Uninstall TrackingMainActivityApp 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.json is present
  • Check Firebase project configuration
  • Verify Firebase Analytics dependency

Support

For technical support and questions:


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.