// Path: debugoverlay/src/main/java/com/ms_square/debugoverlay/OverlayModule.java
// public abstract class OverlayModule<T> implements DataModule<T>, ViewModule<T> {
// 
//     private final DataModule<T> dataModule;
// 
//     private final ViewModule<T> viewModule;
// 
//     public OverlayModule(DataModule<T> dataModule, ViewModule<T> viewModule) {
//         this.dataModule = dataModule;
//         this.viewModule = viewModule;
//     }
// 
//     @Override
//     public void start() {
//         dataModule.addObserver(viewModule);
//         dataModule.start();
//     }
// 
//     @Override
//     public void stop() {
//         dataModule.removeObserver(viewModule);
//         dataModule.stop();
//     }
// 
//     @Override
//     public void notifyObservers() {
//         dataModule.notifyObservers();
//     }
// 
//     @Override
//     public void addObserver(@NonNull DataObserver observer) {
//         dataModule.addObserver(observer);
//     }
// 
//     @Override
//     public void removeObserver(@NonNull DataObserver observer) {
//         dataModule.removeObserver(observer);
//     }
// 
//     @Override
//     public void onDataAvailable(T data) {
//         viewModule.onDataAvailable(data);
//     }
// 
//     @Override
//     public View createView(@NonNull ViewGroup root, @ColorInt int textColor, float textSize, float textAlpha) {
//         return viewModule.createView(root, textColor, textSize, textAlpha);
//     }
// }
// 
// Path: debugoverlay/src/main/java/com/ms_square/debugoverlay/ViewModule.java
// public interface ViewModule<T> extends DataObserver<T> {
// 
//     /**
//      * Given the root (overlay's view container), create an overlay view to add
//      * either programmatically or using LayoutInflater.
//      * You are also given the preferred textColor, textSize, and textAlpha for your overlay view.
//      * Please respect those passed values unless you have good reason not to do so.
//      *
//      * Note:
//      * {@link DataObserver}'s onDataAvailable could be called before this method if systemLayer is
//      * not allowed to use. So, it's safe to do null checks within onDataAvailable()
//      * for any view variable references you keep as a result of this method.
//      *
//      * @param root
//      * @param textColor
//      * @param textSize - in sp
//      * @param textAlpha
//      * @return View to be added to the overlay container.
//      */
//     @NonNull
//     View createView(@NonNull ViewGroup root, @ColorInt int textColor, float textSize, float textAlpha);
// }


import com.ms_square.debugoverlay.OverlayModule;
import com.ms_square.debugoverlay.ViewModule;
package com.ms_square.debugoverlay.modules;


public class FpsModule extends OverlayModule<Double> {

    public static final int DEFAULT_INTERVAL = 1000; // 1000ms

// Path: debugoverlay/src/main/java/com/ms_square/debugoverlay/OverlayModule.java
// public abstract class OverlayModule<T> implements DataModule<T>, ViewModule<T> {
// 
//     private final DataModule<T> dataModule;
// 
//     private final ViewModule<T> viewModule;
// 
//     public OverlayModule(DataModule<T> dataModule, ViewModule<T> viewModule) {
//         this.dataModule = dataModule;
//         this.viewModule = viewModule;
//     }
// 
//     @Override
//     public void start() {
//         dataModule.addObserver(viewModule);
//         dataModule.start();
//     }
// 
//     @Override
//     public void stop() {
//         dataModule.removeObserver(viewModule);
//         dataModule.stop();
//     }
// 
//     @Override
//     public void notifyObservers() {
//         dataModule.notifyObservers();
//     }
// 
//     @Override
//     public void addObserver(@NonNull DataObserver observer) {
//         dataModule.addObserver(observer);
//     }
// 
//     @Override
//     public void removeObserver(@NonNull DataObserver observer) {
//         dataModule.removeObserver(observer);
//     }
// 
//     @Override
//     public void onDataAvailable(T data) {
//         viewModule.onDataAvailable(data);
//     }
// 
//     @Override
//     public View createView(@NonNull ViewGroup root, @ColorInt int textColor, float textSize, float textAlpha) {
//         return viewModule.createView(root, textColor, textSize, textAlpha);
//     }
// }
// 
// Path: debugoverlay/src/main/java/com/ms_square/debugoverlay/ViewModule.java
// public interface ViewModule<T> extends DataObserver<T> {
// 
//     /**
//      * Given the root (overlay's view container), create an overlay view to add
//      * either programmatically or using LayoutInflater.
//      * You are also given the preferred textColor, textSize, and textAlpha for your overlay view.
//      * Please respect those passed values unless you have good reason not to do so.
//      *
//      * Note:
//      * {@link DataObserver}'s onDataAvailable could be called before this method if systemLayer is
//      * not allowed to use. So, it's safe to do null checks within onDataAvailable()
//      * for any view variable references you keep as a result of this method.
//      *
//      * @param root
//      * @param textColor
//      * @param textSize - in sp
//      * @param textAlpha
//      * @return View to be added to the overlay container.
//      */
//     @NonNull
//     View createView(@NonNull ViewGroup root, @ColorInt int textColor, float textSize, float textAlpha);
// }


// Path: debugoverlay-no-op/src/main/java/com/ms_square/debugoverlay/modules/FpsModule.java
import com.ms_square.debugoverlay.OverlayModule;
import com.ms_square.debugoverlay.ViewModule;

package com.ms_square.debugoverlay.modules;


public class FpsModule extends OverlayModule<Double> {

    public static final int DEFAULT_INTERVAL = 1000; // 1000ms

    public FpsModule() {