package de.mprengemann.intellij.plugin.androidicons; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; import com.intellij.openapi.components.ApplicationComponent; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.Task; import com.intellij.util.io.ZipUtil; import de.mprengemann.intellij.plugin.androidicons.controllers.DefaultControllerFactory; import de.mprengemann.intellij.plugin.androidicons.controllers.IControllerFactory; import de.mprengemann.intellij.plugin.androidicons.model.IconPack; import de.mprengemann.intellij.plugin.androidicons.model.Resolution; import de.mprengemann.intellij.plugin.androidicons.resources.ResourceLoader; import org.apache.commons.io.FileUtils; import org.jetbrains.annotations.NotNull; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; import java.util.Properties; public class IconApplication implements ApplicationComponent { private static final String TAG = IconApplication.class.getSimpleName(); private static final Logger LOGGER = Logger.getInstance(TAG); private IControllerFactory controllerFactory; @NotNull @Override public String getComponentName() { return getClass().getName(); } @Override public void initComponent() { IconPack androidIcons = null; IconPack materialIcons = null; try { final InputStream bundledIconPackPropertiesFile = ResourceLoader.getBundledResourceStream("icon_packs.properties"); final Properties bundledIconPackProperties = new Properties(); bundledIconPackProperties.load(bundledIconPackPropertiesFile); final boolean export; final File localIconPackPropertiesFile = new File(ResourceLoader.getExportPath(), "icon_packs.properties"); if (!localIconPackPropertiesFile.exists()) { export = true; } else { final Properties localIconPackProperties = new Properties(); localIconPackProperties.load(FileUtils.openInputStream(localIconPackPropertiesFile)); export = Integer.parseInt(bundledIconPackProperties.getProperty("version")) != Integer.parseInt(localIconPackProperties.getProperty("version")); } final File contentFile = ResourceLoader.getBundledResource("content.json"); assert contentFile != null; final FileReader fileReader = new FileReader(contentFile); final Type listType = new TypeToken<ArrayList<IconPack>>() {}.getType(); GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.registerTypeAdapter(Resolution.class, new Resolution.Deserializer()); final Gson gson = gsonBuilder.create(); final List<IconPack> iconPacks = gson.fromJson(fileReader, listType); androidIcons = iconPacks.get(0); materialIcons = iconPacks.get(1); if (export) { new Task.Modal(null, "Prepare Android Drawable Importer", false) { @Override public void run(@NotNull ProgressIndicator progressIndicator) { progressIndicator.setIndeterminate(true); final File archiveFile = ResourceLoader.getBundledResource("icon_packs.zip"); final File bundledResource = ResourceLoader.getBundledResource("icon_packs.properties"); final File localResource = new File(ResourceLoader.getExportPath(), "icon_packs.properties"); try { assert archiveFile != null; ZipUtil.extract(archiveFile, ResourceLoader.getExportPath(), null, true); assert bundledResource != null; FileUtils.copyFile(bundledResource, localResource); } catch (IOException e) { LOGGER.error(e); } } }.queue(); } } catch (Exception e) { LOGGER.error(e); } controllerFactory = new DefaultControllerFactory(androidIcons, materialIcons); } @Override public void disposeComponent() { controllerFactory.tearDown(); controllerFactory = null; } public IControllerFactory getControllerFactory() { return controllerFactory; } }