package fr.jcgay.notification.notifier.anybar; import com.google.common.annotations.VisibleForTesting; import com.google.common.io.Closeables; import fr.jcgay.notification.Icon; import fr.jcgay.notification.IconFileWriter; import fr.jcgay.notification.SendNotificationException; import net.coobird.thumbnailator.Thumbnailator; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import static com.google.common.io.Closeables.closeQuietly; public class AnyBarIconWriter implements IconFileWriter { private final String destination; @VisibleForTesting AnyBarIconWriter(String destination) { this.destination = destination.endsWith("/") ? destination : destination + '/'; } public AnyBarIconWriter() { this(System.getProperty("user.home") + "/.AnyBar/"); } @Override public void write(Icon icon) { for (Dimension dimension : Dimension.values()) { File resizedIcon = new File(destination + icon.id() + dimension.fileNameSuffix + "." + icon.extension()); if (!resizedIcon.exists()) { new File(destination).mkdirs(); InputStream input = null; OutputStream output = null; try { input = icon.content().openStream(); output = new FileOutputStream(resizedIcon); Thumbnailator.createThumbnail(input, output, dimension.width, dimension.height); } catch (IOException e) { throw new SendNotificationException("Can't write notification icon: " + resizedIcon.getPath(), e); } finally { closeQuietly(input); try { Closeables.close(output, true); } catch (IOException ignored) {} } } } } private enum Dimension { CLASSIC(19, 19), RETINA(38, 38, "@2x"); private final int width; private final int height; private final String fileNameSuffix; Dimension(int width, int height, String fileNameSuffix) { this.width = width; this.height = height; this.fileNameSuffix = fileNameSuffix; } Dimension(int width, int height) { this(width, height, ""); } } }