package com.xenoage.utils.android; import java.io.IOException; import java.util.List; import android.content.Intent; import android.content.res.Resources; import com.xenoage.utils.PlatformUtils; import com.xenoage.utils.android.font.AndroidTextMeasurer; import com.xenoage.utils.android.io.AndroidIO; import com.xenoage.utils.android.xml.AndroidXmlReader; import com.xenoage.utils.annotations.NonNull; import com.xenoage.utils.async.AsyncResult; import com.xenoage.utils.font.TextMeasurer; import com.xenoage.utils.io.FilesystemInput; import com.xenoage.utils.io.InputStream; import com.xenoage.utils.io.OutputStream; import com.xenoage.utils.io.ZipReader; import com.xenoage.utils.jse.io.JseInputStream; import com.xenoage.utils.jse.thread.ThreadUtils; import com.xenoage.utils.promise.Promise; import com.xenoage.utils.xml.XmlReader; import com.xenoage.utils.xml.XmlWriter; /** * Android specific {@link PlatformUtils} implementation. * * @author Andreas Wenger */ public class AndroidPlatformUtils extends PlatformUtils { private static AndroidPlatformUtils instance = null; private AndroidIO androidIO = null; private AndroidTextMeasurer textMeasurer = new AndroidTextMeasurer(); /** * Gets the {@link AndroidPlatformUtils} instance. * {@link #init(Resources)} has to be called before. */ public static AndroidPlatformUtils androidPlatformUtils() { assertInitialized(); return instance; } /** * Initializes the {@link PlatformUtils} class for usage within an * Android environment (using an instance of {@link AndroidPlatformUtils}), * using the given {@link Resources}. */ public static void init(Resources res) { instance = new AndroidPlatformUtils(); instance.androidIO = new AndroidIO(res); PlatformUtils.init(instance); } private static void assertInitialized() { if (instance == null) throw new IllegalStateException(AndroidPlatformUtils.class.getSimpleName() + " not initialized"); } /** * Gets the {@link AndroidIO} instance. * {@link #init(Resources)} has to be called before. */ public static AndroidIO io() { assertInitialized(); return instance.androidIO; } @Override public List<StackTraceElement> getCurrentStackTrace() { return ThreadUtils.getCurrentStackTrace(); } @Override public String getStackTraceString(Throwable throwable) { return ThreadUtils.getStackTraceString(throwable); } @Override public StackTraceElement getCaller(int level) { return ThreadUtils.getCaller(level + 1); } @Override public TextMeasurer getTextMeasurer() { return textMeasurer; } @Override public AndroidIO getFilesystemInput() { return io(); } @Override public void openFileAsync(String filePath, AsyncResult<InputStream> result) { try { InputStream stream = openFile(filePath); result.onSuccess(stream); } catch (IOException ex) { result.onFailure(ex); } } @Override public Promise<InputStream> openFileAsync(String filePath) { return new Promise<InputStream>((ret) -> { try { InputStream stream = openFile(filePath); ret.resolve(stream); } catch (IOException ex) { ret.reject(ex); } }); } /** * Convenience method for opening an {@link InputStream} for the file at the given relative path. * This method is blocking. */ @NonNull public InputStream openFile(String filePath) throws IOException { return io().openFile(filePath); } @Override public XmlReader createXmlReader(InputStream inputStream) { return new AndroidXmlReader(new JseInputStream(inputStream)); } @Override public XmlWriter createXmlWriter(OutputStream outputStream) { return null; } @Override public ZipReader createZipReader(InputStream inputStream) { return null; } @Override public void exit(Throwable ex) { System.exit(1); //TODO } }