package com.intellij.flex.build; import com.intellij.flex.FlexCommonUtils; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import gnu.trove.THashMap; import java.io.IOException; import java.util.Map; public class AirDescriptorOptions { public static final int ANDROID_PERMISSION_INTERNET = 1; public static final int ANDROID_PERMISSION_WRITE_EXTERNAL_STORAGE = 2; public static final int ANDROID_PERMISSION_ACCESS_FINE_LOCATION = 4; public static final int ANDROID_PERMISSION_CAMERA = 8; public final String AIR_VERSION; public final String APP_ID; public final String APP_NAME; public final String APP_VERSION; public final String SWF_NAME; public final String[] EXTENSIONS; public final boolean MOBILE; public final boolean AUTO_ORIENTS; public final boolean FULL_SCREEN; public final boolean ANDROID; public final int ANDROID_PERMISSIONS; public final boolean IOS; public final boolean IPHONE; public final boolean IPAD; public final boolean IOS_HIGH_RESOLUTION; public AirDescriptorOptions(final String airVersion, final String appId, final String appName, final String swfName, final String[] extensions, final boolean android, final boolean ios) { this(airVersion, appId, appName, "0.0.0", swfName, extensions, android || ios, android || ios, android || ios, android, ANDROID_PERMISSION_INTERNET, ios, ios, ios, ios); } public AirDescriptorOptions(final String airVersion, final String appId, final String appName, final String appVersion, final String swfName, final String[] extensions, final boolean mobile, final boolean autoOrients, final boolean fullScreen, final boolean android, final int androidPermissions, final boolean ios, final boolean iPhone, final boolean iPad, final boolean iosHighResolution) { AIR_VERSION = airVersion; APP_ID = appId; APP_NAME = appName; APP_VERSION = appVersion; SWF_NAME = swfName; EXTENSIONS = extensions; MOBILE = mobile; AUTO_ORIENTS = autoOrients; FULL_SCREEN = fullScreen; ANDROID = android; ANDROID_PERMISSIONS = androidPermissions; IOS = ios; IPHONE = iPhone; IPAD = iPad; IOS_HIGH_RESOLUTION = iosHighResolution; } public String getAirDescriptorText() throws IOException { // noinspection IOResourceOpenedButNotSafelyClosed final String rawText = FileUtil.loadTextAndClose(AirDescriptorOptions.class.getResourceAsStream("air_descriptor_template.ft")); return replaceMacros(rawText); } private String replaceMacros(final String descriptorText) { final Map<String, String> replacementMap = new THashMap<>(); replacementMap.put("${air_version}", AIR_VERSION); replacementMap.put("${app_id}", APP_ID); replacementMap.put("${app_name}", APP_NAME); replacementMap.put("${app_version}", APP_VERSION); replacementMap.put("${swf_name}", SWF_NAME); if (EXTENSIONS.length == 0) { replacementMap.put("${extensions_comment_start}", "<!--"); replacementMap.put("${extensions_comment_end}", "-->"); replacementMap.put("${extensions_list}", "<extensionID></extensionID>"); } else { final StringBuilder buf = new StringBuilder(); for (String extensionId : EXTENSIONS) { if (buf.length() > 0) buf.append("\n "); buf.append("<extensionID>").append(extensionId).append("</extensionID>"); } replacementMap.put("${extensions_comment_start}", ""); replacementMap.put("${extensions_comment_end}", ""); replacementMap.put("${extensions_list}", buf.toString()); } replacementMap.put("${auto_orients}", MOBILE ? String.valueOf(AUTO_ORIENTS) : ""); replacementMap.put("${auto_orients_comment_start}", MOBILE ? "" : "<!--"); replacementMap.put("${auto_orients_comment_end}", MOBILE ? "" : "-->"); replacementMap.put("${full_screen}", MOBILE ? String.valueOf(FULL_SCREEN) : ""); replacementMap.put("${full_screen_comment_start}", MOBILE ? "" : "<!--"); replacementMap.put("${full_screen_comment_end}", MOBILE ? "" : "-->"); replacementMap.put("${iOS_comment_start}", MOBILE && IOS ? "" : "<!--"); replacementMap.put("${iOS_comment_end}", MOBILE && IOS ? "" : "-->"); replacementMap.put("${iPhone_comment_start}", MOBILE && IOS && IPHONE ? "" : "<!--"); replacementMap.put("${iPhone_comment_end}", MOBILE && IOS && IPHONE ? "" : "-->"); replacementMap.put("${iPad_comment_start}", MOBILE && IOS && IPAD ? "" : "<!--"); replacementMap.put("${iPad_comment_end}", MOBILE && IOS && IPAD ? "" : "-->"); replacementMap.put("${iOS_high_resolution_comment_start}", MOBILE && IOS && IOS_HIGH_RESOLUTION ? "" : "<!--"); replacementMap.put("${iOS_high_resolution_comment_end}", MOBILE && IOS && IOS_HIGH_RESOLUTION ? "" : "-->"); replacementMap.put("${android_comment_start}", MOBILE && ANDROID ? "" : "<!--"); replacementMap.put("${android_comment_end}", MOBILE && ANDROID ? "" : "-->"); replacementMap.put("${android_internet_comment_start}", MOBILE && ANDROID && (ANDROID_PERMISSIONS & ANDROID_PERMISSION_INTERNET) != 0 ? "" : "<!--"); replacementMap.put("${android_internet_comment_end}", MOBILE && ANDROID && (ANDROID_PERMISSIONS & ANDROID_PERMISSION_INTERNET) != 0 ? "" : "-->"); replacementMap.put("${android_write_external_storage_comment_start}", MOBILE && ANDROID && (ANDROID_PERMISSIONS & ANDROID_PERMISSION_WRITE_EXTERNAL_STORAGE) != 0 ? "" : "<!--"); replacementMap.put("${android_write_external_storage_comment_end}", MOBILE && ANDROID && (ANDROID_PERMISSIONS & ANDROID_PERMISSION_WRITE_EXTERNAL_STORAGE) != 0 ? "" : "-->"); replacementMap.put("${android_access_fine_location_comment_start}", MOBILE && ANDROID && (ANDROID_PERMISSIONS & ANDROID_PERMISSION_ACCESS_FINE_LOCATION) != 0 ? "" : "<!--"); replacementMap.put("${android_access_fine_location_comment_end}", MOBILE && ANDROID && (ANDROID_PERMISSIONS & ANDROID_PERMISSION_ACCESS_FINE_LOCATION) != 0 ? "" : "-->"); replacementMap.put("${android_camera_comment_start}", MOBILE && ANDROID && (ANDROID_PERMISSIONS & ANDROID_PERMISSION_CAMERA) != 0 ? "" : "<!--"); replacementMap.put("${android_camera_comment_end}", MOBILE && ANDROID && (ANDROID_PERMISSIONS & ANDROID_PERMISSION_CAMERA) != 0 ? "" : "-->"); return FlexCommonUtils.replace(descriptorText, replacementMap); } }