Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Table of Contents

Enabling The Module

You can enable it as described here.

In-App Messages

In order to show your user an in-app message, you need to create a targeting action on RMC panel and fill the related fields first. Then, you can trigger the targeting action you created as show below and show it to the user via your mobile application.

Kotlin

Code Block
languagekotlin
val parameters = HashMap<String, String>()
RelatedDigital.customEvent(
  context = context,
  pageName = "In-App Message",
  properties = parameters,
  parent = activity
)

Java

Code Block
languagejava
HashMap<String, String> parameters = new HashMap<String, String>();
RelatedDigital.customEvent(
  context,
  "In-App Message",
  parameters,
  activity
);
Info

The parameter parent above cannot be null. If you do not enter an Activity value for paremeter parent, the message is not going to be shown.

Info

If you use a rule in your targeting action on RMC, you should enter it via properties map. Example,

parameters["OM.inapptype"] = "full_screen_image"

parameters.put("OM.inapptype", "full_screen_image");

Click Action Callback

When the user clicks on the item that includes a link to navigate to another page, you can define what is going to happen by setting a callback method. You should set this callback via RelatedDigital.setInAppButtonInterface() method.

Kotlin

Code Block
languagekotlin
val buttonCallback: InAppButtonInterface = object : InAppButtonInterface {
  override fun onPress(link: String?) {
    //Write the code that is going to be executed after the click
  }
}
RelatedDigital.setInAppButtonInterface(buttonCallback)

val parameters = HashMap<String, String>()
RelatedDigital.customEvent(
  context = context,
  pageName = "In-App Message",
  properties = parameters,
  parent = activity
)

Java

Code Block
languagejava
InAppButtonInterface buttonCallback = new InAppButtonInterface() {
  @Override
  public void onPress(String link) {
    //Write the code that is going to be executed after the click   
  }
};

RelatedDigital.setInAppButtonInterface(buttonCallback);

HashMap<String, String> parameters = new HashMap<String, String>();
RelatedDigital.customEvent(
  context,
  "In-App Message",
  parameters,
  activity
);
Info

After each click, the SDK calls the callback method that was entered and then removes it. Thus, you should set the callback via setInAppButtonInterface for each targeting action that you want to use a callback for click action. Then, you can call customEvent() method.

Custom Font Usage

  1. First of all, you need to create a font folder (unless you have one) under res folder in your project.

    Image Added

     

  2. You can add your font files into the folder (font) you created.

    Image Added

     

  3. Lastly, you should enter the name of the font file without extension in the user interface.

    Image Added


In-App Message Templates

Pop-up - Image, Title, Text & Button

Mini - Icon & Text

Full Screen Image

Image AddedImage Added

 

Image Added

 

Full Screen Image & Button

Pop-up - Image, Title, Text and Button

Pop-up Survey

Image Added

 

Image Added

 

Image Added

 

Pop-up - Text and Button NPS

Native Alert & Action Sheet

1-10 Point NPS

Image Added

 

Image Added

 

Image Added

Survey with Star & Second pop-up

Half Screen Image

Carousel

Image Added

 

Image Added

 

Image Added

 

 

Favori Attributes Action

You can use the favorite attributes that you define on RMC->targeting actions in your application as shown below.

Kotlin

Code Block
languagekotlin
val callback: VisilabsCallback = object : VisilabsCallback {
  override fun success(response: VisilabsResponse?) {
    try {
      val favsResponse: FavsResponse = Gson().fromJson(response!!.rawResponse, FavsResponse::class.java)
      val favBrands: String = favsResponse.favoriteAttributeAction!![0].actiondata!!.favorites!!.brand!![0]!!
      Log.i("Favs 1.Brand", favBrands)
    } catch (e: Exception) {
      Log.e("Favorite Attribute", e.message)
    }
  }

  override fun fail(response: VisilabsResponse?) {
    Log.e("Favorite Attribute", response!!.error!!.message)
  }
}

RelatedDigital.getFavorites(
  context = context,
  actionId = null,
  actionType = Constants.FavoriteAttributeAction,
  visilabsCallback = callback)

Java

Code Block
languagejava
VisilabsCallback callback = new VisilabsCallback() {
  @Override
  public void success(VisilabsResponse response) {
    try {
      FavsResponse favsResponse = new Gson().fromJson(response.getRawResponse(), FavsResponse.class);
      String favBrands = favsResponse.getFavoriteAttributeAction().get(0).getActiondata().getFavorites().getBrand()[0];
      Log.i("Favs 1.Brand", favBrands); 
    } catch(Exception e) {
      Log.e("Favorite Attribute", e.getMessage());
    }     
  }

  @Override
  public void fail(VisilabsResponse response) {
    Log.e("Favorite Attribute", response.getError().getMessage);
  }
};

RelatedDigital.getFavorites(
  context,
  null,
  Constants.FavoriteAttributeAction,
  callback);

Story Manager

First of all, you should put StoryRecyclerView into wherever you want in your layout.

Code Block
languagexml
<com.relateddigital.relateddigital_android.inapp.story.StoryRecyclerView
  android:id="@+id/story_recycler_view"
  android:layout_width="match_parent"
  android:layout_height="wrap_content" />

Theni you should define a StoryItemClickListener object and determine what action is going to be taken after a story is clicked.

Then, you should call setStoryAction() or setStoryActionId() methods with StoryItemClickListener object you defined.

Kotlin

Code Block
languagekotlin
val storyItemClickListener = object : StoryItemClickListener {
  override fun storyItemClicked(storyLink: String?) {
    //Take the action here by using storyLink variable
  }
}     
binding.storyRecyclerView.setStoryAction(
  context = context,
  storyItemClickListener = storyItemClickListener)

Java

Code Block
languagejava
StoryItemClickListener storyItemClickListener = new StoryItemClickListener() {
  @Override
  public void storyItemClicked(String storyLink) {
    //Take the action here by using storyLink variable         
  }
};   
binding.storyRecyclerView.setStoryAction(
  context,
  storyItemClickListener);

with ID

Kotlin

Code Block
languagekotlin
val storyItemClickListener = object : StoryItemClickListener {
  override fun storyItemClicked(storyLink: String?) {
    //Take the action here by using storyLink variable
  }
}     
binding.storyRecyclerView.setStoryActionId(
  context = context,
  storyId = storyId,
  storyItemClickListener = storyItemClickListener)

Java

Code Block
languagejava
StoryItemClickListener storyItemClickListener = new StoryItemClickListener() {
  @Override
  public void storyItemClicked(String storyLink) {
    //Take the action here by using storyLink variable         
  }
};     
binding.storyRecyclerView.setStoryActionId(
  context,
  storyId,
  storyItemClickListener);

You can use setStoryActionWithRequestCallback() or setStoryActionIdWithRequestCallback() methods instead if you want to enter a StoryRequestListener object. This parameter is for you to take a precaution in case of something goes wrong and the request fails. In this case, you should make the visibility of StoryRecyclerView View.GONE so that there will not be an empty area in your layout.

Kotlin

Code Block
languagekotlin
val storyItemClickListener = object : StoryItemClickListener {
  override fun storyItemClicked(storyLink: String?) {
    //Take the action here by using storyLink variable    
  }
}
val storyRequestListener = object : StoryRequestListener {
  override fun onRequestResult(isAvailable: Boolean) {
    if (!isAvailable) {
      //Make the StoryRecyclerView's visibility View.GONE here
      binding.storyRecyclerView.visibility = View.GONE
    }
  }
}    
binding.storyRecyclerView.setStoryActionWithRequestCallback(
  context = context,
  storyItemClickListener = storyItemClickListener,
  storyRequestListener = storyRequestListener)

Java

Code Block
languagejava
StoryItemClickListener storyItemClickListener = new StoryItemClickListener() {
  @Override
  public void storyItemClicked(String storyLink) {
    //Take the action here by using storyLink variable             
  }
}; 

StoryRequestListener storyRequestListener = new StoryRequestListener() {
  @Override
  public void onRequestResult(boolean isAvailable) {
    if (!isAvailable) {
      //Make the StoryRecyclerView's visibility View.GONE here
      binding.storyRecyclerView.visibility = View.GONE
    }         
  }
};
   
binding.storyRecyclerView.setStoryActionWithRequestCallback(
  context,
  storyItemClickListener,
  storyRequestListener);

with ID

Kotlin

Code Block
languagekotlin
val storyItemClickListener = object : StoryItemClickListener {
  override fun storyItemClicked(storyLink: String?) {
    //Take the action here by using storyLink variable    
  }
}
val storyRequestListener = object : StoryRequestListener {
  override fun onRequestResult(isAvailable: Boolean) {
    if (!isAvailable) {
      //Make the StoryRecyclerView's visibility View.GONE here
      binding.storyRecyclerView.visibility = View.GONE
    }
  }
}    
binding.storyRecyclerView.setStoryActionIdWithRequestCallback(
  context = context,
  storyId = storyId,
  storyItemClickListener = storyItemClickListener,
  storyRequestListener = storyRequestListener)

Java

Code Block
languagejava
StoryItemClickListener storyItemClickListener = new StoryItemClickListener() {
  @Override
  public void storyItemClicked(String storyLink) {
    //Take the action here by using storyLink variable            
  }
}; 

StoryRequestListener storyRequestListener = new StoryRequestListener() {
  @Override
  public void onRequestResult(boolean isAvailable) {
    if (!isAvailable) {
      //Make the StoryRecyclerView's visibility View.GONE here
      binding.storyRecyclerView.visibility = View.GONE
    }         
  }
};
   
binding.storyRecyclerView.setStoryActionIdWithRequestCallback(
  context,
  storyId,
  storyItemClickListener,
  storyRequestListener);

App Banner

You should put BannerRecyclerView into a layout file that you prefer in your project. An example usage:

Code Block
languagexml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.relateddigital.relateddigital_android.inapp.bannercarousel.BannerRecyclerView
        android:id="@+id/bannerListView"
        android:layout_width="match_parent"
        android:layout_height="150dp"/>

    <Button
        android:id="@+id/btn_show_banner"
        android:layout_gravity="center"
        android:layout_width="150dp"
        android:layout_height="50dp"
        android:layout_marginTop="20dp"
        android:background="@drawable/rounded_corners_background"
        android:text="@string/show_banner" />
</LinearLayout>

After putting BannerRecyclerView, you should access the object in the related program code (Java or Kotlin) and you should call the method requestBannerCarouselAction() on this object. This method takes 1 mandatory (context: Context) and 3 optional parameters (properties: HashMap<String, String>?, bannerRequestListener: BannerRequestListener?, bannerItemClickListener: BannerItemClickListener?).

properties is for adding extra query parameters you want, to the request.

bannerRequestListener is for making the visibility of BannerRecyclerView object View.GONE or View.VISIBLE if something goes wrong in the process so that the related area on the screen won’t be empty.

bannerItemClickListener is for getting the control when the user clicks on a banner. If you don’t want the SDK to direct the user to the link automatically, you can use this interface.

You can find an example usage that includes all parameters, below:

Kotlin

Code Block
languagekotlin
val bannerItemClickListener = object : BannerItemClickListener {
  override fun bannerItemClicked(bannerLink: String?) {
    if(bannerLink.isNullOrEmpty()) {
      return
    }
    Toast.makeText(applicationContext, bannerLink, Toast.LENGTH_SHORT).show()
    Log.i("link banner", bannerLink)
    try {
      val viewIntent = Intent(Intent.ACTION_VIEW, Uri.parse(bannerLink))
      startActivity(viewIntent)
    } catch (e: Exception) {
      Log.e(LOG_TAG, "The link is not formatted properly!")
    }
  }
}

val bannerRequestListener = object : BannerRequestListener {
  override fun onRequestResult(isAvailable: Boolean) {
      if (!isAvailable) {
        binding?.bannerListView.visibility = View.GONE
      }
  }
}

val properties = HashMap<String, String>()
properties["OM.inapptype"] = "banner_carousel"

binding?.bannerListView.requestBannerCarouselAction(
  context = applicationContext,
  properties = properties,
  bannerRequestListener = bannerRequestListener,
  bannerItemClickListener = bannerItemClickListener
)

Java

Code Block
languagejava
BannerItemClickListener bannerItemClickListener = new BannerItemClickListener() {
  @Override
  public void bannerItemClicked(String bannerLink) {
    if(bannerLink == null || bannerLink.isEmpty()) {
      return;
    }
    Toast.makeText(getApplicationContext(), bannerLink, Toast.LENGTH_SHORT).show();
    Log.i("link banner", bannerLink);
    try {
      Intent viewIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(bannerLink));
      startActivity(viewIntent);
    } catch (Exception e) {
      Log.e(LOG_TAG, "The link is not formatted properly!");
    }
  }
};

BannerRequestListener bannerRequestListener = new BannerRequestListener() {
  @Override
  public void onRequestResult(boolean isAvailable) {
      if (!isAvailable) {
        binding.bannerListView.visibility = View.GONE;
      }
  }
};

HashMap<String, String> properties = new HashMap<String, String>();
properties.put("OM.inapptype", "banner_carousel");

binding.bannerListView.requestBannerCarouselAction(
  applicationContext,
  properties,
  bannerRequestListener,
  bannerItemClickListener
);

Recommendations Action

You can trigger recommendations action in your application as shown below:

Kotlin

Code Block
languagekotlin
val callback: VisilabsCallback = object : VisilabsCallback {
  override fun success(response: VisilabsResponse?) {
    try {
      //You can take the action here with the recommendations' response. Example,
      val jsonObject = response!!.json
      val groupTitle = jsonObject!!.getString("title")
      val jsonArray = jsonObject.getJSONArray("recommendations")
      for (i in 0 until jsonArray.length()) {
        val currentProductObject = jsonArray.getJSONObject(i)
        val currentProductTitle = currentProductObject.getString("title")
        val currentProductPrice = currentProductObject.getDouble("price")
        val currentProductFreeShipping = currentProductObject.getBoolean("freeshipping")
        val qs = currentProductObject.getString("qs")
        //Continues like this...
      }
    } catch (e: Exception) {
      Log.e("Recommendations", e.message)
    }
  }

  override fun fail(response: VisilabsResponse?) {
    Log.e("Recommendations", response!!.error!!.message)
  }
}

RelatedDigital.getRecommendations(
  context = context,
  zoneId = "zoneIdValue",
  productCode = "productCodeValue",
  visilabsCallback = callback)

Java

Code Block
languagejava
VisilabsCallback callback = new VisilabsCallback() {
  @Override
  public void success(VisilabsResponse response) {
    try {
      //You can take the action here with the recommendations' response. Example,
      JSONObject jsonObject = response.getJson();
      String groupTitle = jsonObject.getString("title");
      JSONArray jsonArray = jsonObject.getJSONArray("recommendations");
      for (int i = 0; i < jsonArray.length(); i++) {
         JSONObject currentProductObject = jsonArray.getJSONObject(i);
         String currentProductTitle = currentProductObject.getString("title");
         Double currentProductPrice = currentProductObject.getDouble("price");
         Boolean currentProductFreeShipping = currentProductObject.getBoolean("freeshipping");
         String qs = currentProductObject.getString("qs");
         //Continues like this...
      }
    } catch(Exception e) {
      Log.e("Recommendations", e.getMessage());
    }    
  }

  @Override
  public void fail(VisilabsResponse response) {
    Log.e("Recommendations", response.getError().getMessage());
  }
};

RelatedDigital.getRecommendations(
  context,
  "zoneIdValue",
  "productCodeValue",
  callback);

Also, you can input some filters and extra parameters to getRecommendations() method.

Kotlin

Code Block
languagekotlin
val callback: VisilabsCallback = object : VisilabsCallback {
  override fun success(response: VisilabsResponse?) {
    try {
      //You can take the action here with the recommendations' response. Example,
      val jsonObject = response!!.json
      val groupTitle = jsonObject!!.getString("title")
      val jsonArray = jsonObject.getJSONArray("recommendations")
      for (i in 0 until jsonArray.length()) {
        val currentProductObject = jsonArray.getJSONObject(i)
        val currentProductTitle = currentProductObject.getString("title")
        val currentProductPrice = currentProductObject.getDouble("price")
        val currentProductFreeShipping = currentProductObject.getBoolean("freeshipping")
        val qs = currentProductObject.getString("qs")
        //Continues like this...
      }
    } catch (e: Exception) {
      Log.e("Recommendations", e.message)
    }
  }

  override fun fail(response: VisilabsResponse?) {
    Log.e("Recommendations", response!!.error!!.message)
  }
}

val filters = ArrayList<VisilabsTargetFilter>()
val parameters = HashMap<String, String>()
parameters["OM.extra"] = "Extra Value"
val f1 = VisilabsTargetFilter("attr1", "0", "value1")
filters.add(f1)
val f2 = VisilabsTargetFilter("attr2", "1", "value2")
filters.add(f2)

RelatedDigital.getRecommendations(
  context = context,
  zoneId = "zoneIdValue",
  productCode = "productCodeValue",
  visilabsCallback = callback,
  properties = parameters,
  filters = filters)

Java

Code Block
languagejava
VisilabsCallback callback = new VisilabsCallback() {
  @Override
  public void success(VisilabsResponse response) {
    try {
      //You can take the action here with the recommendations' response. Example,
      JSONObject jsonObject = response.getJson();
      String groupTitle = jsonObject.getString("title");
      JSONArray jsonArray = jsonObject.getJSONArray("recommendations");
      for (int i = 0; i < jsonArray.length(); i++) {
         JSONObject currentProductObject = jsonArray.getJSONObject(i);
         String currentProductTitle = currentProductObject.getString("title");
         Double currentProductPrice = currentProductObject.getDouble("price");
         Boolean currentProductFreeShipping = currentProductObject.getBoolean("freeshipping");
         String qs = currentProductObject.getString("qs");
         //Continues like this...
      }
    } catch(Exception e) {
      Log.e("Recommendations", e.getMessage());
    }    
  }

  @Override
  public void fail(VisilabsResponse response) {
    Log.e("Recommendations", response.getError().getMessage());
  }
};

ArrayList<VisilabsTargetFilter> filters = new ArrayList<VisilabsTargetFilter>();
HashMap<String, String> parameters = new HashMap<String, String>();
parameters.put("OM.extra", "Extra Value");
VisilabsTargetFilter f1 = new VisilabsTargetFilter("attr1", "0", "value1");
filters.add(f1);
VisilabsTargetFilter f2 = new VisilabsTargetFilter("attr2", "1", "value2");
filters.add(f2);

RelatedDigital.getRecommendations(
  context,
  "zoneIdValue",
  "productCodeValue",
  callback,
  parameters,
  filters = filters);

In order the clicks of the recommendations to be reflected on the panel, you should send the “qs” value of the recommendation that is clicked by the user to the server via trackRecommendationClick() method.

Info

You can see how to get “qs” value for each recommendation in the example callback method above.

Kotlin

Code Block
languagekotlin
RelatedDigital.trackRecommendationClick(
  context = context,
  qs = qs)

Java

Code Block
languagejava
RelatedDigital.trackRecommendationClick(
  context,
  qs);

Mail Subscription Form

You can trigger the mail subscription form that you defined on RMC panel as shown below:

Kotlin

Code Block
languagekotlin
val parameters = HashMap<String, String>()
RelatedDigital.customEvent(
  context = context,
  pageName = "Mail Subscription",
  properties = parameters,
  parent = activity
)

Java

Code Block
languagejava
HashMap<String, String> parameters = new HashMap<String, String>();
RelatedDigital.customEvent(
  context,
  "Mail Subscription",
  parameters,
  activity
);

...

Info

Please make sure that you input an Activity with the parameter of parent.

If you define a rule for your targeting action on RMC panel, please make sure that you add this rule to the map before calling customEvent() method. Example,

parameters["type"] = "mail_subs_form"

parameters.put("type", "mail_subs_form");

SpinToWin

You can trigger the spin-to-win action that you defined on RMC panel as shown below:

Kotlin

Code Block
languagekotlin
val parameters = HashMap<String, String>()
RelatedDigital.customEvent(
  context = context,
  pageName = "SpinToWin",
  properties = parameters,
  parent = activity
)

Java

Code Block
languagejava
HashMap<String, String> parameters = new HashMap<String, String>();
RelatedDigital.customEvent(
  context,
  "SpinToWin",
  parameters,
  activity
);

Çarkıfelek Yarım Görünüm

Çarkıfelek Tam Görünüm

Image Added

 

Image Added

 

Info

Please make sure that you input an Activity with the parameter of parent.

If you define a rule for your targeting action on RMC panel, please make sure that you add this rule to the map before calling customEvent() method. Example,

parameters["type"] = "spin_to_win"

parameters.put("type", "spin_to_win");

ScratchToWin

You can trigger the scratch-to-win action that you defined on RMC panel as shown below:

Kotlin

Code Block
languagekotlin
val parameters = HashMap<String, String>()
RelatedDigital.customEvent(
  context = context,
  pageName = "ScratchToWin",
  properties = parameters,
  parent = activity
)

Java

Code Block
languagejava
HashMap<String, String> parameters = new HashMap<String, String>();
RelatedDigital.customEvent(
  context,
  "ScratchToWin",
  parameters,
  activity
);

...

Info

Please make sure that you input an Activity with the parameter of parent.

If you define a rule for your targeting action on RMC panel, please make sure that you add this rule to the map before calling customEvent() method. Example,

parameters["type"] = "scratch_to_win"

parameters.put("type", "scratch_to_win");

Product Stat Notifier

You can trigger the product stat notifier action that you defined on RMC panel as shown below:

Kotlin

Code Block
languagekotlin
val parameters = HashMap<String, String>()
RelatedDigital.customEvent(
  context = context,
  pageName = "Product Stat Notifier",
  properties = parameters,
  parent = activity
)

Java

Code Block
languagejava
HashMap<String, String> parameters = new HashMap<String, String>();
RelatedDigital.customEvent(
  context,
  "Product Stat Notifier",
  parameters,
  activity
);

...

Info

Please make sure that you input an Activity with the parameter of parent.

If you define a rule for your targeting action on RMC panel, please make sure that you add this rule to the map before calling customEvent() method. Example,

parameters["type"] = "product_stat_notifier"

parameters.put("type", "product_stat_notifier");

Drawer

You can trigger the drawer action that you defined on RMC panel as shown below:

Kotlin

Code Block
languagekotlin
val parameters = HashMap<String, String>()
RelatedDigital.customEvent(
  context = context,
  pageName = "Drawer",
  properties = parameters,
  parent = activity
)

Java

Code Block
languagejava
HashMap<String, String> parameters = new HashMap<String, String>();
RelatedDigital.customEvent(
  context,
  "Drawer",
  parameters,
  activity
);

 

...

 

Info

Please make sure that you input an Activity with the parameter of parent.

If you define a rule for your targeting action on RMC panel, please make sure that you add this rule to the map before calling customEvent() method. Example,

parameters["type"] = "drawer"

parameters.put("type", "drawer");

Example Application

RelatedDigital Example Application