// 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/dependencyinjection/Injector.java
// public class Injector {
// 
//     private Context context;
//     private Config config;
//     private WindowManager windowManager;
//     private NotificationManager notificationManager;
//     private ServerInfoProvider serverInfoProvider;
//     private NotificationProvider notificationProvider;
//     private WebServer webServer;
//     private DeviceInfoProvider deviceInfoProvider;
//     private Gson gson;
//     private ConvertersContainer convertersContainer;
//     private HierarchyViewConverter hierarchyViewConverter;
//     private HierarchyViewProvider hierarchyViewProvider;
//     private FileUtilsProvider fileUtilsProvider;
// 
//     public Injector(Context context, Config config) {
//         this.context = context.getApplicationContext();
//         this.config = config;
//     }
// 
//     public Config getConfig() {
//         return config;
//     }
// 
//     public ConvertersContainer getConvertersContainer() {
// 
//         if (convertersContainer == null) {
//             convertersContainer = new ConvertersContainer();
//         }
// 
//         return convertersContainer;
//     }
// 
//     public DeviceInfoProvider getDeviceInfoProvider() {
// 
//         if (deviceInfoProvider == null) {
//             deviceInfoProvider = new DeviceInfoProvider(context);
//         }
// 
//         return deviceInfoProvider;
//     }
// 
//     public FileUtilsProvider getFileUtilsProvider() {
// 
//         if (fileUtilsProvider == null) {
//             fileUtilsProvider = new FileUtilsProvider();
//         }
// 
//         return fileUtilsProvider;
//     }
// 
//     public Gson getGson() {
// 
//         if (gson == null) {
//             gson = new GsonBuilder()
//                     .registerTypeAdapter(ImageView.ScaleType.class, new ScaleTypeSerializer())
//                     .create();
//         }
// 
//         return gson;
//     }
// 
//     public HierarchyViewConverter getHierarchyViewConverter() {
// 
//         if (hierarchyViewConverter == null) {
//             hierarchyViewConverter = new HierarchyViewConverter();
//         }
// 
//         return hierarchyViewConverter;
//     }
// 
//     public HierarchyViewProvider getHierarchyViewProvider() {
// 
//         if (hierarchyViewProvider == null) {
//             hierarchyViewProvider = new HierarchyViewProvider(getWindowManager());
//         }
// 
//         return hierarchyViewProvider;
//     }
// 
//     public NotificationManager getNotificationManager() {
// 
//         if (notificationManager == null) {
//             notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
//         }
// 
//         return notificationManager;
//     }
// 
//     public NotificationProvider getNotificationProvider() {
// 
//         if (notificationProvider == null) {
//             notificationProvider = new NotificationProvider(context);
//         }
// 
//         return notificationProvider;
//     }
// 
//     public ServerInfoProvider getServerInfoProvider() {
// 
//         if (serverInfoProvider == null) {
//             serverInfoProvider = new ServerInfoProvider(context);
//         }
// 
//         return serverInfoProvider;
//     }
// 
//     public WebServer getWebServer() {
// 
//         if (webServer == null) {
//             webServer = new WebServer(context, getConfig().getPort());
//         }
// 
//         return webServer;
//     }
// 
//     public WindowManager getWindowManager() {
// 
//         if (windowManager == null) {
//             windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
//         }
// 
//         return windowManager;
//     }
// }


import android.content.Context;
import android.content.Intent;
import com.polidea.hierarchyviewer.internal.HierarchyViewerService;
import com.polidea.hierarchyviewer.internal.dependencyinjection.Injector;
package com.polidea.hierarchyviewer;



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) {
// 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/dependencyinjection/Injector.java
// public class Injector {
// 
//     private Context context;
//     private Config config;
//     private WindowManager windowManager;
//     private NotificationManager notificationManager;
//     private ServerInfoProvider serverInfoProvider;
//     private NotificationProvider notificationProvider;
//     private WebServer webServer;
//     private DeviceInfoProvider deviceInfoProvider;
//     private Gson gson;
//     private ConvertersContainer convertersContainer;
//     private HierarchyViewConverter hierarchyViewConverter;
//     private HierarchyViewProvider hierarchyViewProvider;
//     private FileUtilsProvider fileUtilsProvider;
// 
//     public Injector(Context context, Config config) {
//         this.context = context.getApplicationContext();
//         this.config = config;
//     }
// 
//     public Config getConfig() {
//         return config;
//     }
// 
//     public ConvertersContainer getConvertersContainer() {
// 
//         if (convertersContainer == null) {
//             convertersContainer = new ConvertersContainer();
//         }
// 
//         return convertersContainer;
//     }
// 
//     public DeviceInfoProvider getDeviceInfoProvider() {
// 
//         if (deviceInfoProvider == null) {
//             deviceInfoProvider = new DeviceInfoProvider(context);
//         }
// 
//         return deviceInfoProvider;
//     }
// 
//     public FileUtilsProvider getFileUtilsProvider() {
// 
//         if (fileUtilsProvider == null) {
//             fileUtilsProvider = new FileUtilsProvider();
//         }
// 
//         return fileUtilsProvider;
//     }
// 
//     public Gson getGson() {
// 
//         if (gson == null) {
//             gson = new GsonBuilder()
//                     .registerTypeAdapter(ImageView.ScaleType.class, new ScaleTypeSerializer())
//                     .create();
//         }
// 
//         return gson;
//     }
// 
//     public HierarchyViewConverter getHierarchyViewConverter() {
// 
//         if (hierarchyViewConverter == null) {
//             hierarchyViewConverter = new HierarchyViewConverter();
//         }
// 
//         return hierarchyViewConverter;
//     }
// 
//     public HierarchyViewProvider getHierarchyViewProvider() {
// 
//         if (hierarchyViewProvider == null) {
//             hierarchyViewProvider = new HierarchyViewProvider(getWindowManager());
//         }
// 
//         return hierarchyViewProvider;
//     }
// 
//     public NotificationManager getNotificationManager() {
// 
//         if (notificationManager == null) {
//             notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
//         }
// 
//         return notificationManager;
//     }
// 
//     public NotificationProvider getNotificationProvider() {
// 
//         if (notificationProvider == null) {
//             notificationProvider = new NotificationProvider(context);
//         }
// 
//         return notificationProvider;
//     }
// 
//     public ServerInfoProvider getServerInfoProvider() {
// 
//         if (serverInfoProvider == null) {
//             serverInfoProvider = new ServerInfoProvider(context);
//         }
// 
//         return serverInfoProvider;
//     }
// 
//     public WebServer getWebServer() {
// 
//         if (webServer == null) {
//             webServer = new WebServer(context, getConfig().getPort());
//         }
// 
//         return webServer;
//     }
// 
//     public WindowManager getWindowManager() {
// 
//         if (windowManager == null) {
//             windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
//         }
// 
//         return windowManager;
//     }
// }


// Path: hierarchyviewer/src/main/java/com/polidea/hierarchyviewer/HierarchyViewer.java
import android.content.Context;
import android.content.Intent;
import com.polidea.hierarchyviewer.internal.HierarchyViewerService;
import com.polidea.hierarchyviewer.internal.dependencyinjection.Injector;

package com.polidea.hierarchyviewer;



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()) {