PlatformAndroid.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. //
  2. // Copyright (c) 2014-2015, THUNDERBEAST GAMES LLC All rights reserved
  3. // LICENSE: Atomic Game Engine Editor and Tools EULA
  4. // Please see LICENSE_ATOMIC_EDITOR_AND_TOOLS.md in repository root for
  5. // license information: https://github.com/AtomicGameEngine/AtomicGameEngine
  6. //
  7. #include <Atomic/IO/MemoryBuffer.h>
  8. #include <Atomic/IO/FileSystem.h>
  9. #include "../ToolEnvironment.h"
  10. #include "../Subprocess/SubprocessSystem.h"
  11. #include "../License/LicenseSystem.h"
  12. #include "../Build/BuildAndroid.h"
  13. #include "PlatformAndroid.h"
  14. namespace ToolCore
  15. {
  16. PlatformAndroid::PlatformAndroid(Context* context) : Platform(context)
  17. {
  18. }
  19. PlatformAndroid::~PlatformAndroid()
  20. {
  21. }
  22. BuildBase* PlatformAndroid::NewBuild(Project *project)
  23. {
  24. return new BuildAndroid(context_, project);
  25. }
  26. void PlatformAndroid::PrependAndroidCommandArgs(Vector<String> args)
  27. {
  28. #ifdef ATOMIC_PLATFORM_WINDOWS
  29. // android is a batch file on windows, so have to run with cmd /c
  30. args.Push("/c");
  31. args.Push("\"" + GetAndroidCommand() + "\"");
  32. #endif
  33. }
  34. void PlatformAndroid::HandleRefreshAndroidTargetsEvent(StringHash eventType, VariantMap& eventData)
  35. {
  36. if (eventType == E_SUBPROCESSOUTPUT)
  37. {
  38. targetOutput_ += eventData[SubprocessOutput::P_TEXT].GetString();
  39. }
  40. else if (eventType == E_SUBPROCESSCOMPLETE)
  41. {
  42. refreshAndroidTargetsProcess_ = 0;
  43. androidTargets_.Clear();
  44. MemoryBuffer reader(targetOutput_.CString(), targetOutput_.Length() + 1);
  45. while (!reader.IsEof())
  46. {
  47. String line = reader.ReadLine();
  48. if (line.StartsWith("id:"))
  49. {
  50. //id: 33 or "Google Inc.:Google APIs (x86 System Image):19"
  51. Vector<String> elements = line.Split('\"');
  52. if (elements.Size() == 2)
  53. {
  54. String api = elements[1];
  55. androidTargets_.Push(api);
  56. }
  57. }
  58. }
  59. SendEvent(E_ANDROIDTARGETSREFRESHED);
  60. }
  61. }
  62. void PlatformAndroid::RefreshAndroidTargets()
  63. {
  64. if (refreshAndroidTargetsProcess_.NotNull())
  65. return;
  66. SubprocessSystem* subs = GetSubsystem<SubprocessSystem>();
  67. String androidCommand = GetAndroidCommand();
  68. Vector<String> args;
  69. PrependAndroidCommandArgs(args);
  70. args.Push("list");
  71. args.Push("targets");
  72. targetOutput_.Clear();
  73. refreshAndroidTargetsProcess_ = subs->Launch(androidCommand, args);
  74. if (refreshAndroidTargetsProcess_.NotNull())
  75. {
  76. SubscribeToEvent(refreshAndroidTargetsProcess_, E_SUBPROCESSCOMPLETE, HANDLER(PlatformAndroid, HandleRefreshAndroidTargetsEvent));
  77. SubscribeToEvent(refreshAndroidTargetsProcess_, E_SUBPROCESSOUTPUT, HANDLER(PlatformAndroid, HandleRefreshAndroidTargetsEvent));
  78. }
  79. }
  80. String PlatformAndroid::GetADBCommand() const
  81. {
  82. ToolPrefs* prefs = GetSubsystem<ToolEnvironment>()->GetToolPrefs();
  83. String adbCommand = prefs->GetAndroidSDKPath();
  84. #ifdef ATOMIC_PLATFORM_OSX
  85. adbCommand += "/platform-tools/adb";
  86. #else
  87. adbCommand += "/platform-tools/adb.exe";
  88. #endif
  89. return adbCommand;
  90. }
  91. String PlatformAndroid::GetAndroidCommand() const
  92. {
  93. ToolPrefs* prefs = GetSubsystem<ToolEnvironment>()->GetToolPrefs();
  94. String androidCommand = GetNativePath(prefs->GetAndroidSDKPath());
  95. if (!androidCommand.Length())
  96. return String::EMPTY;
  97. #ifdef ATOMIC_PLATFORM_OSX
  98. //Vector<String> args = String("list targets").Split(' ');
  99. androidCommand += "/tools/android";
  100. #else
  101. // android is a batch file on windows, so have to run with cmd /c
  102. androidCommand += "\\tools\\android.bat";
  103. //androidCommand = "cmd";
  104. #endif
  105. return androidCommand;
  106. }
  107. bool PlatformAndroid::GetLicense()
  108. {
  109. // BEGIN LICENSE MANAGEMENT
  110. return GetSubsystem<LicenseSystem>()->GetLicenseAndroid();
  111. // END LICENSE MANAGEMENT
  112. }
  113. }