// Path: hierarchyviewer/src/main/java/com/polidea/hierarchyviewer/Config.java
// public class Config {
// 
//     private static final int DEFAULT_PORT = 4000;
// 
//     private HashMap<Class<? extends View>, ModelInfo> convertersHashMap;
// 
//     private int port;
// 
//     private Config(Builder configBuilder) {
//         convertersHashMap = new HashMap<>();
//         for (Map.Entry<? extends Class<? extends View>, ? extends ModelInfo> entry : configBuilder.convertersHashMap.entrySet()) {
//             convertersHashMap.put(entry.getKey(), entry.getValue());
//         }
//         port = configBuilder.port;
//     }
// 
//     public HashMap<Class<? extends View>, ModelInfo> getConvertersHashMap() {
//         return convertersHashMap;
//     }
// 
//     public int getPort() {
//         return port;
//     }
// 
//     public static class Builder {
// 
//         private HashMap<Class<? extends View>, ModelInfo> convertersHashMap;
// 
//         private int port;
// 
//         public Builder() {
//             convertersHashMap = new HashMap<>();
//             port = DEFAULT_PORT;
//         }
// 
//         public Builder add(Class<? extends View> clazz, ModelInfo modelInfo) {
//             convertersHashMap.put(clazz, modelInfo);
//             return this;
//         }
// 
//         public Builder port(int port) {
//             port = port;
//             return this;
//         }
// 
//         public Config build() {
//             return new Config(this);
//         }
//     }
// }
// 
// Path: hierarchyviewer/src/main/java/com/polidea/hierarchyviewer/HierarchyViewer.java
// public class HierarchyViewer {
// 
//     private static Injector injector;
// 
//     public static Injector injector() {
//         return injector;
//     }
// 
//     public static boolean isInjector() {
//         return injector != null;
//     }
// 
//     public static void start(Context context) {
//         start(context, new Config.Builder().build());
//     }
// 
//     public static void start(Context context, Config config) {
//         if (HierarchyViewerService.isRunning()) {
//             return;
//         }
// 
//         injector = new Injector(context, config);
// 
//         context.startService(new Intent(context, HierarchyViewerService.class));
//     }
// }
// 
// Path: hierarchyviewer/src/main/java/com/polidea/hierarchyviewer/internal/HierarchyViewerService.java
// public class HierarchyViewerService extends Service {
// 
//     private static boolean isRunning = false;
//     private WebServer server;
//     private Config config;
//     private ConvertersContainer convertersContainer;
//     private NotificationProvider notificationProvider;
//     private DeviceInfoProvider deviceInfoProvider;
// 
//     public static boolean isRunning() {
//         return isRunning;
//     }
// 
//     @Override
//     public IBinder onBind(Intent intent) {
//         return null;
//     }
// 
//     @Override
//     public void onCreate() {
//         super.onCreate();
// 
//         server = HierarchyViewer.injector().getWebServer();
//         config = HierarchyViewer.injector().getConfig();
//         convertersContainer = HierarchyViewer.injector().getConvertersContainer();
//         notificationProvider = HierarchyViewer.injector().getNotificationProvider();
//         deviceInfoProvider = HierarchyViewer.injector().getDeviceInfoProvider();
// 
//         addCustomConvertersFromConfig();
// 
//     }
// 
//     @Override
//     public void onDestroy() {
//         super.onDestroy();
//         server.stop();
//         isRunning = false;
// 
//         notificationProvider.cancelServerAddressNotificationWithUrl();
//     }
// 
//     @Override
//     public int onStartCommand(Intent intent, int flags, int startId) {
//         if (!isRunning) {
//             startServerAndShowNotification();
//         }
//         if (notificationProvider.isTurnOffNotificationIntent(intent)) {
//             stopSelf();
//         }
//         return START_NOT_STICKY;
//     }
// 
//     private void addCustomConvertersFromConfig() {
//         for (Map.Entry<? extends Class<? extends View>, ? extends ModelInfo> entry : config.getConvertersHashMap().entrySet()) {
//             convertersContainer.addConverterForView(entry.getKey(), entry.getValue());
//         }
//     }
// 
//     private void startServerAndShowNotification() {
//         try {
//             server.start();
//             isRunning = true;
// 
//             notificationProvider.showServerAddressNotificationWithUrl();
//             deviceInfoProvider.logServerAddressInfoMessage();
//         } catch (IOException e) {
//             e.printStackTrace();
//         }
//     }
// 
// }


import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.support.v4.app.NotificationCompat;
import com.polidea.hierarchyviewer.Config;
import com.polidea.hierarchyviewer.HierarchyViewer;
import com.polidea.hierarchyviewer.R;
import com.polidea.hierarchyviewer.internal.HierarchyViewerService;
package com.polidea.hierarchyviewer.internal.provider;



public class NotificationProvider {

    private static final String NOTIFICATION_ACTION_KEY = "NOTIFICATION_ACTION_KEY";
    private static final int NOTIFICATION_TURN_OFF_ACTION = 3000;
    private static final int NOTIFICATION_ID = 1000;
    private static final int NOTIFICATION_TURN_OFF_REQUEST_CODE = 2000;
    private final Context context;
    private NotificationManager notificationManager;
    private ServerInfoProvider serverInfoProvider;
    private Config config;

    public NotificationProvider(Context context) {
        this.context = context;
// Path: hierarchyviewer/src/main/java/com/polidea/hierarchyviewer/Config.java
// public class Config {
// 
//     private static final int DEFAULT_PORT = 4000;
// 
//     private HashMap<Class<? extends View>, ModelInfo> convertersHashMap;
// 
//     private int port;
// 
//     private Config(Builder configBuilder) {
//         convertersHashMap = new HashMap<>();
//         for (Map.Entry<? extends Class<? extends View>, ? extends ModelInfo> entry : configBuilder.convertersHashMap.entrySet()) {
//             convertersHashMap.put(entry.getKey(), entry.getValue());
//         }
//         port = configBuilder.port;
//     }
// 
//     public HashMap<Class<? extends View>, ModelInfo> getConvertersHashMap() {
//         return convertersHashMap;
//     }
// 
//     public int getPort() {
//         return port;
//     }
// 
//     public static class Builder {
// 
//         private HashMap<Class<? extends View>, ModelInfo> convertersHashMap;
// 
//         private int port;
// 
//         public Builder() {
//             convertersHashMap = new HashMap<>();
//             port = DEFAULT_PORT;
//         }
// 
//         public Builder add(Class<? extends View> clazz, ModelInfo modelInfo) {
//             convertersHashMap.put(clazz, modelInfo);
//             return this;
//         }
// 
//         public Builder port(int port) {
//             port = port;
//             return this;
//         }
// 
//         public Config build() {
//             return new Config(this);
//         }
//     }
// }
// 
// Path: hierarchyviewer/src/main/java/com/polidea/hierarchyviewer/HierarchyViewer.java
// public class HierarchyViewer {
// 
//     private static Injector injector;
// 
//     public static Injector injector() {
//         return injector;
//     }
// 
//     public static boolean isInjector() {
//         return injector != null;
//     }
// 
//     public static void start(Context context) {
//         start(context, new Config.Builder().build());
//     }
// 
//     public static void start(Context context, Config config) {
//         if (HierarchyViewerService.isRunning()) {
//             return;
//         }
// 
//         injector = new Injector(context, config);
// 
//         context.startService(new Intent(context, HierarchyViewerService.class));
//     }
// }
// 
// Path: hierarchyviewer/src/main/java/com/polidea/hierarchyviewer/internal/HierarchyViewerService.java
// public class HierarchyViewerService extends Service {
// 
//     private static boolean isRunning = false;
//     private WebServer server;
//     private Config config;
//     private ConvertersContainer convertersContainer;
//     private NotificationProvider notificationProvider;
//     private DeviceInfoProvider deviceInfoProvider;
// 
//     public static boolean isRunning() {
//         return isRunning;
//     }
// 
//     @Override
//     public IBinder onBind(Intent intent) {
//         return null;
//     }
// 
//     @Override
//     public void onCreate() {
//         super.onCreate();
// 
//         server = HierarchyViewer.injector().getWebServer();
//         config = HierarchyViewer.injector().getConfig();
//         convertersContainer = HierarchyViewer.injector().getConvertersContainer();
//         notificationProvider = HierarchyViewer.injector().getNotificationProvider();
//         deviceInfoProvider = HierarchyViewer.injector().getDeviceInfoProvider();
// 
//         addCustomConvertersFromConfig();
// 
//     }
// 
//     @Override
//     public void onDestroy() {
//         super.onDestroy();
//         server.stop();
//         isRunning = false;
// 
//         notificationProvider.cancelServerAddressNotificationWithUrl();
//     }
// 
//     @Override
//     public int onStartCommand(Intent intent, int flags, int startId) {
//         if (!isRunning) {
//             startServerAndShowNotification();
//         }
//         if (notificationProvider.isTurnOffNotificationIntent(intent)) {
//             stopSelf();
//         }
//         return START_NOT_STICKY;
//     }
// 
//     private void addCustomConvertersFromConfig() {
//         for (Map.Entry<? extends Class<? extends View>, ? extends ModelInfo> entry : config.getConvertersHashMap().entrySet()) {
//             convertersContainer.addConverterForView(entry.getKey(), entry.getValue());
//         }
//     }
// 
//     private void startServerAndShowNotification() {
//         try {
//             server.start();
//             isRunning = true;
// 
//             notificationProvider.showServerAddressNotificationWithUrl();
//             deviceInfoProvider.logServerAddressInfoMessage();
//         } catch (IOException e) {
//             e.printStackTrace();
//         }
//     }
// 
// }


// Path: hierarchyviewer/src/main/java/com/polidea/hierarchyviewer/internal/provider/NotificationProvider.java
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.support.v4.app.NotificationCompat;
import com.polidea.hierarchyviewer.Config;
import com.polidea.hierarchyviewer.HierarchyViewer;
import com.polidea.hierarchyviewer.R;
import com.polidea.hierarchyviewer.internal.HierarchyViewerService;

package com.polidea.hierarchyviewer.internal.provider;



public class NotificationProvider {

    private static final String NOTIFICATION_ACTION_KEY = "NOTIFICATION_ACTION_KEY";
    private static final int NOTIFICATION_TURN_OFF_ACTION = 3000;
    private static final int NOTIFICATION_ID = 1000;
    private static final int NOTIFICATION_TURN_OFF_REQUEST_CODE = 2000;
    private final Context context;
    private NotificationManager notificationManager;
    private ServerInfoProvider serverInfoProvider;
    private Config config;

    public NotificationProvider(Context context) {
        this.context = context;
        notificationManager = HierarchyViewer.injector().getNotificationManager();