AndroidProjectGenerator.cpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. // Copyright (c) 2014-2015, THUNDERBEAST GAMES LLC All rights reserved
  2. // Please see LICENSE.md in repository root for license information
  3. // https://github.com/AtomicGameEngine/AtomicGameEngine
  4. #include <Poco/File.h>
  5. #include "AtomicEditor.h"
  6. #include <Atomic/IO/File.h>
  7. #include "../AEEditor.h"
  8. #include "../AEPreferences.h"
  9. #include "BuildSystem.h"
  10. #include "AndroidProjectGenerator.h"
  11. namespace AtomicEditor
  12. {
  13. AndroidProjectGenerator::AndroidProjectGenerator(Context* context) :
  14. Object(context)
  15. {
  16. BuildSystem* buildSystem = GetSubsystem<BuildSystem>();
  17. buildSettings_ = buildSystem->GetBuildSettings()->GetAndroidSettings();
  18. }
  19. AndroidProjectGenerator::~AndroidProjectGenerator()
  20. {
  21. }
  22. bool AndroidProjectGenerator::Generate()
  23. {
  24. if (!GenerateAndroidManifest())
  25. return false;
  26. if (!GenerateStringXML())
  27. return false;
  28. if (!GenerateLocalProperties())
  29. return false;
  30. if (!GenerateProjectProperties())
  31. return false;
  32. if (!GenerateActivitySource())
  33. return false;
  34. return true;
  35. }
  36. bool AndroidProjectGenerator::GenerateActivitySource()
  37. {
  38. if (!buildSettings_.package.Length())
  39. {
  40. errorText_ = "Invalid Package Name";
  41. return false;
  42. }
  43. Vector<String> elements = buildSettings_.package.Split('.');
  44. String path;
  45. path.Join(elements, "/");
  46. path = buildPath_ + "/src/" + path;
  47. Poco::File dirs(path.CString());
  48. dirs.createDirectories();
  49. if (!dirs.exists())
  50. {
  51. errorText_ = "Unable to create ";
  52. return false;
  53. }
  54. String source;
  55. source.AppendWithFormat("package %s;\n", buildSettings_.package.CString());
  56. source += "import org.libsdl.app.SDLActivity;\n";
  57. source += "public class AtomicGameEngine extends SDLActivity {\n";
  58. source += "}\n";
  59. File file(context_, path + "/AtomicGameEngine.java", FILE_WRITE);
  60. if (!file.IsOpen())
  61. return false;
  62. file.Write(source.CString(), source.Length());
  63. return true;
  64. }
  65. bool AndroidProjectGenerator::GenerateLocalProperties()
  66. {
  67. Editor* editor = GetSubsystem<Editor>();
  68. String sdkPath = editor->GetPreferences()->GetAndroidSDKPath();
  69. if (!sdkPath.Length())
  70. {
  71. errorText_ = "Invalid Android SDK Path";
  72. return false;
  73. }
  74. String props;
  75. props.AppendWithFormat("sdk.dir=%s", sdkPath.CString());
  76. File file(context_, buildPath_ + "/local.properties", FILE_WRITE);
  77. if (!file.IsOpen())
  78. return false;
  79. file.Write(props.CString(), props.Length());
  80. return true;
  81. }
  82. bool AndroidProjectGenerator::GenerateProjectProperties()
  83. {
  84. String apiString = buildSettings_.targetSDKVersion;
  85. if (!apiString.Length())
  86. {
  87. errorText_ = "Invalid Android API";
  88. return false;
  89. }
  90. String props;
  91. props.AppendWithFormat("target=%s", apiString.CString());
  92. File file(context_, buildPath_ + "/project.properties", FILE_WRITE);
  93. if (!file.IsOpen())
  94. return false;
  95. file.Write(props.CString(), props.Length());
  96. return true;
  97. }
  98. bool AndroidProjectGenerator::GenerateStringXML()
  99. {
  100. if (!buildSettings_.appName.Length())
  101. {
  102. errorText_ = "Invalid App Name";
  103. return false;
  104. }
  105. String strings = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
  106. strings += "<resources>\n";
  107. strings.AppendWithFormat("<string name=\"app_name\">%s</string>\n", buildSettings_.appName.CString());
  108. strings += "</resources>\n";
  109. File file(context_, buildPath_ + "/res/values/strings.xml", FILE_WRITE);
  110. if (!file.IsOpen())
  111. return false;
  112. file.Write(strings.CString(), strings.Length());
  113. return true;
  114. }
  115. bool AndroidProjectGenerator::GenerateAndroidManifest()
  116. {
  117. if (!buildSettings_.package.Length())
  118. {
  119. errorText_ = "Invalid Package Name";
  120. return false;
  121. }
  122. buildSettings_.activityName = "AtomicGameEngine";
  123. if (!buildSettings_.activityName.Length())
  124. {
  125. errorText_ = "Invalid Activity Name";
  126. return false;
  127. }
  128. String manifest = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
  129. manifest += "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n";
  130. manifest.AppendWithFormat("package=\"%s\"\n", buildSettings_.package.CString());
  131. manifest += "android:versionCode=\"1\"\n";
  132. manifest += "android:versionName=\"1.0\">\n";
  133. manifest += "<uses-permission android:name=\"android.permission.INTERNET\" />\n";
  134. manifest += "<uses-feature android:glEsVersion=\"0x00020000\" />\n";
  135. manifest += "<uses-sdk android:targetSdkVersion=\"12\" android:minSdkVersion=\"10\" />\n";
  136. manifest += "<application android:label=\"@string/app_name\" android:icon=\"@drawable/icon\">\n";
  137. manifest.AppendWithFormat("<activity android:name=\".%s\"\n", buildSettings_.activityName.CString());
  138. manifest += "android:label=\"@string/app_name\"\n";
  139. manifest += "android:theme=\"@android:style/Theme.NoTitleBar.Fullscreen\"\n";
  140. manifest += "android:configChanges=\"keyboardHidden|orientation\"\n";
  141. manifest += "android:screenOrientation=\"landscape\">\n";
  142. manifest += "<intent-filter>\n";
  143. manifest += "<action android:name=\"android.intent.action.MAIN\" />\n";
  144. manifest += "<category android:name=\"android.intent.category.LAUNCHER\" />\n";
  145. manifest += "</intent-filter>\n";
  146. manifest += "</activity>\n";
  147. manifest += "</application>\n";
  148. manifest += "</manifest>\n";
  149. File file(context_, buildPath_ + "/AndroidManifest.xml", FILE_WRITE);
  150. if (!file.IsOpen())
  151. return false;
  152. file.Write(manifest.CString(), manifest.Length());
  153. return true;
  154. }
  155. }
  156. /*
  157. */