madman-android

Additional

Language
Kotlin
Version
v1.0.9 (Jul 2, 2020)
Created
Jan 22, 2020
Updated
Dec 23, 2020 (Retired)
Owner
Flipkart Incubator (flipkart-incubator)
Contributor
Anirudh Ramanan (anirudhramanan)
1
Activity
Badge
Generate
Download
Source code

madman

The Madman library (Media Ads Manager) enables you to advertise video contents with video ads. If you have your own VAST server and want to render video ads on Android and have full control over the UI, then this library is for you.

The library is designed to

  • retrieve ads from VAST-compliant ad servers
  • help handle ad playback
  • collect and report metrics back to ad servers.

Note: It is in alpha stage

Why Madman ?

Performance

Madman uses native views to render ads view as compared to IMA which uses WebView, hence making it slower.

Initial numbers have shown madman is ~700 ms faster in loading pre-roll ads compared to other libraries such as IMA. Test env: API-29 emulator, wifi, similar ad response, 5 iterations:

  • IMA: 2.04 seconds
  • Madman: 1.35 seconds

The madman is approximately ~700 ms faster in loading the pre-roll ad as compared to IMA.

Load time comparison:

Full control over the user interface

The library allows you to have full control over the user interface for the ads view. You can create your own custom layout, or use the library’s default layout to render overlays.

  • change skip ad UI
  • change learn more UI
  • change "Ad starting in.." UI
  • custom UI layer

Features and Extensibility

The library allows you to have your own custom implementation of components such as network layer, xml parser layer. It even allows you to add callbacks for listening to ad events such as “Ad starting in..”.

Integration

If you need to integrate directly with the madman library, follow the below steps

1. Get Madman

Add the jitpack dependency in your root build.gradle

allprojects {
  repositories {
    maven { url "https://jitpack.io" }
  }
}

Add the madman dependency

dependencies {
   // core madman library
   implementation 'com.github.flipkart-incubator.madman-android:madman:$latest_version'
   
   // optional network layer module for fetching vmap/vast from server, sending tracking events etc
   implementation 'com.github.flipkart-incubator.madman-android:madman-okhttp-extension:$latest_version'
}

2. Initialise Madman

val madman = Madman.Builder()
              .setAdLoadListener(this) // ad load callbacks
              .setNetworkLayer(DefaultNetworkLayer(context)) // use the default network layer, override if necessary
              .build(context)

Read the doc to understand the components in detail.

3. Create AdRenderer

AdRenderer houses the logic for rendering the UI components on the top of the ad. The library provides a default layout for the ad overlay, which can be overriden if required.

val adRenderer = DefaultAdRenderer.Builder()
    .setPlayer(this) // player interface
    .setContainer(adViewGroup) // parent view to which the overlay gets added
    .build(null) // passing null will fallback to default UI layout

To override the default layout, create a new AdViewBinder and pass it while calling build on the AdRenderer

val adViewBinder = AdViewBinder.Builder()
             .setLayoutId(R.layout.ad_overlay) // layout of custom ad overlay
      .setSkipViewId(R.id.skip_button) // specify the skip view id
      .setClickThroughViewId(R.id.click_throught_button) // specify the learn more view id
      .build()

val adRenderer = DefaultAdRenderer.Builder()
    .setPlayer(this) // player interface
    .setContainer(adViewGroup) // parent view to which the overlay gets added
    .build(adViewBinder) // passing custom ad view binder

4. Request Ads

  • From network:
val request = NetworkAdRequest()
request.setUrl(adTagUri.toString())
madman.requestAds(request, adRenderer)
  • From local cache:
val request = StringAdRequest()
request.setResponse(adResponse)
madman.requestAds(request, adRenderer)

The AdLoadListener#onAdManagerLoaded is called when the AdManager is initialised. The AdManager which is available as a parameter of the callback should be used to interact with the library.

For example:

adManager.addAdEventListener(eventListener) // to listen to add events
adManager.addAdErrorListener(errorListener) // to listen to add errors

Exo-Player Integration

If you are using exo-player, you can directly use the MadmanAdLoader plugin which acts as a glue between the madman library and exo-player instance.

dependencies {
   implementation 'com.github.flipkart-incubator.madman-android:madman-exoplayer-extension:$latest_version'
}

Checkout the demo app and MadmanPlayerManager to understand the integration process in detail.

Demo

This is the demo video of loading a pre-roll ad using the madman library.

Documentation

For more information, read Wiki

What's missing ?

The following features of VAST and VMAP are not available in the library yet:

VAST

  • Companion ads
  • Non-Linear ads
  • Executable media files
  • Ad Pods
  • Wrapper ads (for redirection)
  • Industry icon support

VMAP

  • Ad break time-offsets such as #1, x% etc. Only format supported for now is HH:MM:SS.mmm
  • Ad break tracking events
  • Increasing unit test coverage

Note: Google AdSense/AdManager Ads will not work with this library due to the absense of executable media files support

License

The Apache License

Copyright (c) 2020 Flipkart Internet Pvt. Ltd.

Licensed under the Apache License, Version 2.0 (the "License"); 
you may not use this file except in compliance with the License.

You may obtain a copy of the License at

   https://www.apache.org/licenses/LICENSE-2.0 
   
Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

See the License for the specific language governing permissions and 
limitations under the License.