├── .github └── workflows │ └── responseToSupportIssue.yml ├── .gitignore ├── .idea ├── gradle.xml ├── misc.xml ├── modules.xml └── runConfigurations.xml ├── README.md ├── ScreenShots ├── AFApplicationScreenShot.png ├── AndroidManifestScreenShot.png ├── EventScreenShot.png └── GradleScreenShot.png ├── Untitled ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro ├── release │ ├── app-release.apk │ └── output.json └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── appsflyer │ │ └── androidsampleapp │ │ ├── AFApplication.java │ │ ├── DeepLink.java │ │ └── MainActivity.java │ └── res │ ├── drawable-v24 │ └── ic_launcher_foreground.xml │ ├── drawable │ ├── apps_flyer_logo.png │ └── ic_launcher_background.xml │ ├── layout │ ├── activity_deep_link.xml │ └── activity_main.xml │ ├── mipmap-anydpi-v26 │ ├── ic_launcher.xml │ └── ic_launcher_round.xml │ ├── mipmap-hdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-mdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxxhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ └── values │ ├── colors.xml │ ├── strings.xml │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── license.txt └── settings.gradle /.github/workflows/responseToSupportIssue.yml: -------------------------------------------------------------------------------- 1 | 2 | # This workflow creates new comment from template to an issue 3 | # if it was labled as 'support' 4 | 5 | name: Add comment 6 | on: 7 | issues: 8 | types: 9 | - labeled 10 | jobs: 11 | add-comment: 12 | if: github.event.label.name == 'support' 13 | runs-on: ubuntu-latest 14 | permissions: 15 | issues: write 16 | steps: 17 | - name: Add comment 18 | uses: peter-evans/create-or-update-comment@a35cf36e5301d70b76f316e867e7788a55a31dae 19 | with: 20 | issue-number: ${{ github.event.issue.number }} 21 | body: | 22 | 👋 Hi @${{ github.event.issue.user.login }} and Thank you for reaching out to us. 23 | In order for us to provide optimal support, please submit a ticket to our support team at support@appsflyer.com. 24 | When submitting the ticket, please specify: 25 | - ✅ your AppsFlyer sign-up (account) email 26 | - ✅ app ID 27 | - ✅ production steps 28 | - ✅ logs 29 | - ✅ code snippets 30 | - ✅ and any additional relevant information. 31 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | .externalNativeBuild 10 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 18 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16 | 26 | 27 | 28 | 29 | 30 | 31 | 33 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | # AndroidSampleApp 5 | 6 | This app was created for a sample AppsFlyer SDK integration. 7 | 8 | For more information, check out: https://support.appsflyer.com/hc/en-us/articles/208386173 9 | 10 | Please submit any questions or comments to support@appsflyer.com 11 | 12 |
13 | 14 | ## How to Integrate the AppsFlyer SDK 15 | 16 | ### 1) Add the SDK to your Project in ../app/build.gradle 17 | 18 | 19 | 20 | ### 2) Set the Required Permissions and BroadcastReceiver in AndroidManifest.xml 21 | 22 | 23 | 24 | ### 3) SDK Initialization 25 | 26 | 27 | 28 | ### 4) Tracking In-App Events 29 | 30 | 31 | -------------------------------------------------------------------------------- /ScreenShots/AFApplicationScreenShot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AppsFlyerSDK/appsflyer-android-app/d58e5103b7a8a32dc6dcc8cde4bf3c24a06b5f9e/ScreenShots/AFApplicationScreenShot.png -------------------------------------------------------------------------------- /ScreenShots/AndroidManifestScreenShot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AppsFlyerSDK/appsflyer-android-app/d58e5103b7a8a32dc6dcc8cde4bf3c24a06b5f9e/ScreenShots/AndroidManifestScreenShot.png -------------------------------------------------------------------------------- /ScreenShots/EventScreenShot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AppsFlyerSDK/appsflyer-android-app/d58e5103b7a8a32dc6dcc8cde4bf3c24a06b5f9e/ScreenShots/EventScreenShot.png -------------------------------------------------------------------------------- /ScreenShots/GradleScreenShot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AppsFlyerSDK/appsflyer-android-app/d58e5103b7a8a32dc6dcc8cde4bf3c24a06b5f9e/ScreenShots/GradleScreenShot.png -------------------------------------------------------------------------------- /Untitled: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AppsFlyerSDK/appsflyer-android-app/d58e5103b7a8a32dc6dcc8cde4bf3c24a06b5f9e/Untitled -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 26 5 | defaultConfig { 6 | applicationId "com.appsflyer.androidsampleapp" 7 | minSdkVersion 17 8 | targetSdkVersion 26 9 | versionCode 1 10 | versionName "1.0" 11 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 12 | } 13 | buildTypes { 14 | release { 15 | minifyEnabled false 16 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 17 | } 18 | } 19 | } 20 | 21 | repositories { 22 | mavenCentral() 23 | } 24 | 25 | dependencies { 26 | implementation fileTree(dir: 'libs', include: ['*.jar']) 27 | implementation 'com.android.support:appcompat-v7:26.1.0' 28 | implementation 'com.android.support.constraint:constraint-layout:1.0.2' 29 | testImplementation 'junit:junit:4.12' 30 | androidTestImplementation 'com.android.support.test:runner:1.0.1' 31 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' 32 | 33 | compile 'com.appsflyer:af-android-sdk:5.0.0@aar' 34 | compile 'com.android.installreferrer:installreferrer:1.0' 35 | 36 | } 37 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/release/app-release.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AppsFlyerSDK/appsflyer-android-app/d58e5103b7a8a32dc6dcc8cde4bf3c24a06b5f9e/app/release/app-release.apk -------------------------------------------------------------------------------- /app/release/output.json: -------------------------------------------------------------------------------- 1 | [{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":1},"path":"app-release.apk","properties":{"packageId":"com.appsflyer.androidsampleapp","split":"","minSdkVersion":"17"}}] -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 30 |      31 | 32 |           33 | 34 |       35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 46 | 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /app/src/main/java/com/appsflyer/androidsampleapp/AFApplication.java: -------------------------------------------------------------------------------- 1 | package com.appsflyer.androidsampleapp; 2 | 3 | import android.app.Application; 4 | import android.util.Log; 5 | 6 | import com.appsflyer.AppsFlyerConversionListener; 7 | import com.appsflyer.AppsFlyerLib; 8 | import com.appsflyer.AppsFlyerLibCore; 9 | 10 | import java.util.Map; 11 | 12 | 13 | /********************************************************************* 14 | In order for us to provide optimal support, 15 | we would kindly ask you to submit any issues to support@appsflyer.com 16 | *********************************************************************/ 17 | 18 | 19 | 20 | public class AFApplication extends Application { 21 | 22 | 23 | private static final String AF_DEV_KEY = "AF_DEV_KEY"; 24 | 25 | 26 | @Override 27 | public void onCreate(){ 28 | super.onCreate(); 29 | 30 | /** Set Up Conversion Listener to get attribution data **/ 31 | 32 | AppsFlyerConversionListener conversionListener = new AppsFlyerConversionListener() { 33 | 34 | /* Returns the attribution data. Note - the same conversion data is returned every time per install */ 35 | @Override 36 | public void onConversionDataSuccess(Map conversionData) { 37 | for (String attrName : conversionData.keySet()) { 38 | Log.d(AppsFlyerLibCore.LOG_TAG, "attribute: " + attrName + " = " + conversionData.get(attrName)); 39 | } 40 | setInstallData(conversionData); 41 | } 42 | 43 | @Override 44 | public void onConversionDataFail(String errorMessage) { 45 | Log.d(AppsFlyerLibCore.LOG_TAG, "error getting conversion data: " + errorMessage); 46 | } 47 | 48 | /* Called only when a Deep Link is opened */ 49 | @Override 50 | public void onAppOpenAttribution(Map conversionData) { 51 | for (String attrName : conversionData.keySet()) { 52 | Log.d(AppsFlyerLibCore.LOG_TAG, "attribute: " + attrName + " = " + conversionData.get(attrName)); 53 | } 54 | } 55 | 56 | @Override 57 | public void onAttributionFailure(String errorMessage) { 58 | Log.d(AppsFlyerLibCore.LOG_TAG, "error onAttributionFailure : " + errorMessage); 59 | } 60 | }; 61 | 62 | 63 | /* This API enables AppsFlyer to detect installations, sessions, and updates. */ 64 | 65 | AppsFlyerLib.getInstance().init(AF_DEV_KEY , conversionListener , getApplicationContext()); 66 | AppsFlyerLib.getInstance().startTracking(this); 67 | 68 | 69 | /* Set to true to see the debug logs. Comment out or set to false to stop the function */ 70 | 71 | AppsFlyerLib.getInstance().setDebugLog(true); 72 | 73 | } 74 | 75 | 76 | 77 | /* IGNORE - USED TO DISPLAY INSTALL DATA */ 78 | public static String InstallConversionData = ""; 79 | public static int sessionCount = 0; 80 | public static void setInstallData(Map conversionData){ 81 | if(sessionCount == 0){ 82 | final String install_type = "Install Type: " + conversionData.get("af_status") + "\n"; 83 | final String media_source = "Media Source: " + conversionData.get("media_source") + "\n"; 84 | final String install_time = "Install Time(GMT): " + conversionData.get("install_time") + "\n"; 85 | final String click_time = "Click Time(GMT): " + conversionData.get("click_time") + "\n"; 86 | final String is_first_launch = "Is First Launch: " + conversionData.get("is_first_launch") + "\n"; 87 | InstallConversionData += install_type + media_source + install_time + click_time + is_first_launch; 88 | sessionCount++; 89 | } 90 | 91 | } 92 | 93 | 94 | } 95 | -------------------------------------------------------------------------------- /app/src/main/java/com/appsflyer/androidsampleapp/DeepLink.java: -------------------------------------------------------------------------------- 1 | package com.appsflyer.androidsampleapp; 2 | 3 | import android.os.Bundle; 4 | import android.os.Handler; 5 | import android.support.v7.app.AppCompatActivity; 6 | import android.util.Log; 7 | import android.widget.TextView; 8 | 9 | import com.appsflyer.AppsFlyerConversionListener; 10 | import com.appsflyer.AppsFlyerLib; 11 | import com.appsflyer.AppsFlyerLibCore; 12 | 13 | import java.util.Map; 14 | 15 | /** Test this deep link with the link : https://androidsampleapp.onelink.me/Pvqj */ 16 | /** run: $ adb shell am start -a android.intent.action.VIEW -d https://androidsampleapp.onelink.me/Pvqj */ 17 | 18 | 19 | 20 | public class DeepLink extends AppCompatActivity { 21 | 22 | 23 | final Handler handler = new Handler(); 24 | 25 | @Override 26 | protected void onCreate(Bundle savedInstanceState) { 27 | super.onCreate(savedInstanceState); 28 | setContentView(R.layout.activity_deep_link); 29 | 30 | 31 | /* Add this call to the tracker on each deep linked activity */ 32 | 33 | AppsFlyerLib.getInstance().sendDeepLinkData(this); 34 | 35 | 36 | AppsFlyerLib.getInstance().registerConversionListener(this, new AppsFlyerConversionListener() { 37 | 38 | /* Returns the attribution data. Note - the same conversion data is returned every time per install */ 39 | @Override 40 | public void onConversionDataSuccess(Map conversionData) { 41 | for (String attrName : conversionData.keySet()) { 42 | Log.d(AppsFlyerLibCore.LOG_TAG, "attribute: " + attrName + " = " + conversionData.get(attrName)); 43 | } 44 | } 45 | 46 | @Override 47 | public void onConversionDataFail(String errorMessage) { 48 | Log.d(AppsFlyerLibCore.LOG_TAG, "error onInstallConversionFailure : " + errorMessage); 49 | } 50 | 51 | 52 | /* Called only when a Deep Link is opened */ 53 | @Override 54 | public void onAppOpenAttribution(Map conversionData) { 55 | String attributionDataText = "Attribution Data: \n"; 56 | for (String attrName : conversionData.keySet()) { 57 | Log.d(AppsFlyerLibCore.LOG_TAG, "attribute: " + attrName + " = " + 58 | conversionData.get(attrName)); 59 | attributionDataText += conversionData.get(attrName) + "\n"; 60 | 61 | } 62 | setAttributionText(attributionDataText); 63 | } 64 | 65 | @Override 66 | public void onAttributionFailure(String errorMessage) { 67 | Log.d(AppsFlyerLibCore.LOG_TAG, "error onAttributionFailure : " + errorMessage); 68 | } 69 | }); 70 | 71 | } 72 | 73 | 74 | /* Used to display the deep link data returned from onAppOpenAttribution */ 75 | 76 | public void setAttributionText(final String data){ 77 | 78 | handler.postDelayed(new Runnable() { 79 | @Override 80 | public void run() { 81 | TextView attributionTextView = findViewById(R.id.attributionText); 82 | attributionTextView.setText(data); 83 | } 84 | } , 2500); 85 | } 86 | 87 | } 88 | -------------------------------------------------------------------------------- /app/src/main/java/com/appsflyer/androidsampleapp/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.appsflyer.androidsampleapp; 2 | 3 | import android.os.Bundle; 4 | import android.os.Handler; 5 | import android.support.v7.app.AppCompatActivity; 6 | import android.view.View; 7 | import android.widget.Button; 8 | import android.widget.TextView; 9 | 10 | import com.appsflyer.AFInAppEventParameterName; 11 | import com.appsflyer.AFInAppEventType; 12 | import com.appsflyer.AppsFlyerLib; 13 | 14 | import java.util.HashMap; 15 | import java.util.Map; 16 | 17 | 18 | public class MainActivity extends AppCompatActivity { 19 | 20 | 21 | final Handler handler = new Handler(); 22 | 23 | @Override 24 | protected void onCreate(Bundle savedInstanceState) { 25 | super.onCreate(savedInstanceState); 26 | setContentView(R.layout.activity_main); 27 | SetInstallDataText(); 28 | 29 | Button trackEventButton = findViewById(R.id.trackEventButton); 30 | trackEventButton.setOnClickListener(new View.OnClickListener() { 31 | @Override 32 | public void onClick(View v) { 33 | 34 | /* Track Events in real time */ 35 | Map eventValue = new HashMap(); 36 | eventValue.put(AFInAppEventParameterName.REVENUE, 200); 37 | eventValue.put(AFInAppEventParameterName.CONTENT_TYPE, "category_a"); 38 | eventValue.put(AFInAppEventParameterName.CONTENT_ID, "1234567"); 39 | eventValue.put(AFInAppEventParameterName.CURRENCY, "USD"); 40 | AppsFlyerLib.getInstance().trackEvent(getApplicationContext(), AFInAppEventType.PURCHASE, eventValue); 41 | } 42 | }); 43 | } 44 | 45 | 46 | 47 | /*** Ignore - used to display install data ***/ 48 | public void SetInstallDataText(){ 49 | handler.postDelayed(new Runnable() { 50 | @Override 51 | public void run() { 52 | TextView installData = findViewById(R.id.installDataText); 53 | installData.setText(AFApplication.InstallConversionData); 54 | } 55 | } , 5000); 56 | 57 | } 58 | 59 | } 60 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/apps_flyer_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AppsFlyerSDK/appsflyer-android-app/d58e5103b7a8a32dc6dcc8cde4bf3c24a06b5f9e/app/src/main/res/drawable/apps_flyer_logo.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_deep_link.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 28 | 29 | 43 | 44 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 |