diff --git a/platform/windows/Corona.Simulator/BuildAndroidDlg.cpp b/platform/windows/Corona.Simulator/BuildAndroidDlg.cpp old mode 100755 new mode 100644 index 8fb8e020d..219d54a0d --- a/platform/windows/Corona.Simulator/BuildAndroidDlg.cpp +++ b/platform/windows/Corona.Simulator/BuildAndroidDlg.cpp @@ -29,7 +29,9 @@ #include "Rtt_TargetDevice.h" #include "Rtt_TargetAndroidAppStore.h" #include - +#include +#include +#include // CBuildAndroidDlg dialog @@ -67,9 +69,6 @@ BEGIN_MESSAGE_MAP(CBuildAndroidDlg, CDialog) ON_EN_KILLFOCUS(IDC_BUILD_KEYSTORE, &CBuildAndroidDlg::OnKillFocusKeystorePath) ON_CBN_SELCHANGE(IDC_BUILD_KEYALIAS, &CBuildAndroidDlg::OnChangeAliasList) ON_CBN_SETFOCUS(IDC_BUILD_KEYALIAS, &CBuildAndroidDlg::OnSetFocusAliasList) -#ifdef AUTO_INCLUDE_MONETIZATION_PLUGIN - ON_BN_CLICKED(IDC_ENABLE_MONETIZATION, &CBuildAndroidDlg::OnBnClickedEnableMonetization) -#endif ON_WM_HELPINFO() ON_WM_SYSCOMMAND() ON_BN_CLICKED(IDC_CREATE_LIVE_BUILD, &CBuildAndroidDlg::OnBnClickedCreateLiveBuild) @@ -250,32 +249,14 @@ BOOL CBuildAndroidDlg::OnInitDialog() // Set up the "Live Build" checkbox. CheckDlgButton(IDC_CREATE_LIVE_BUILD, m_pProject->GetCreateLiveBuild() ? BST_CHECKED : BST_UNCHECKED); -#ifdef AUTO_INCLUDE_MONETIZATION_PLUGIN - // Initialize the "Enable Monetization" checkbox - CButton *enableMonetizationBtn = (CButton *)GetDlgItem(IDC_ENABLE_MONETIZATION); - bool debugMonetizationPlugin = AfxGetApp()->GetProfileInt(REGISTRY_SECTION, REGISTRY_DEBUG_MONETIZATION_PLUGIN, - REGISTRY_DEBUG_MONETIZATION_PLUGIN_DEFAULT) ? true : false; - - if (debugMonetizationPlugin) - { - // Load setting from project - enableMonetizationBtn->SetCheck((m_pProject->GetEnableMonetization() ? BST_CHECKED : BST_UNCHECKED)); - } - else - { - // Hide and disable "Enable Monetization" checkbox - enableMonetizationBtn->ShowWindow(SW_HIDE); - enableMonetizationBtn->SetCheck(BST_UNCHECKED); - m_pProject->SetEnableMonetization(false); - } - -#else - // Disable dialog control - CButton *enableMonetizationBtn = (CButton *)GetDlgItem(IDC_ENABLE_MONETIZATION); - enableMonetizationBtn->ShowWindow(SW_HIDE); - enableMonetizationBtn->SetCheck(BST_UNCHECKED); + // Set up the "Build to Device" Radio Group + CButton* pCopyToDevice = (CButton*)GetDlgItem(IDC_COPY_TO_DEVICE); + CButton* pShowInFiles = (CButton*)GetDlgItem(IDC_SHOW_IN_FILES); + CButton* pDoNothing = (CButton*)GetDlgItem(IDC_DO_NOTHING); -#endif // AUTO_INCLUDE_MONETIZATION_PLUGIN + pCopyToDevice->SetCheck((m_pProject->GetAfterBuild() == AB_COPY_TO_DEVICE) ? BST_CHECKED : BST_UNCHECKED); + pShowInFiles->SetCheck((m_pProject->GetAfterBuild() == AB_SHOW_IN_FILES) ? BST_CHECKED : BST_UNCHECKED); + pDoNothing->SetCheck((m_pProject->GetAfterBuild() == AB_DO_NOTHING || m_pProject->GetAfterBuild() == "") ? BST_CHECKED : BST_UNCHECKED); //Default option return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE @@ -575,6 +556,19 @@ void CBuildAndroidDlg::OnSysCommand(UINT nID, LPARAM lParam) } } + +//This will open and run a command promot window +void Exec(CString command) { + ::ShellExecute( + nullptr, + _T("open"), + _T("cmd"), + _T(" /C \"")+command+_T("\""), // params + nullptr, + SW_SHOW); +} + + // OnOK - build project // Retrieve values from dialog, save to registry, // get key alias password if necessary @@ -603,7 +597,7 @@ void CBuildAndroidDlg::OnOK() // OnBuild() if (ret != IDYES) return; AfxGetApp()->WriteProfileString( REGISTRY_BUILD_ANDROID, _T("AcceptedSDKLicense"), _T("YES") ); } - + // Fetch and validate field values. GetDlgItemText(IDC_BUILD_APPNAME, sAppName); sAppName.Trim(); @@ -726,6 +720,14 @@ void CBuildAndroidDlg::OnOK() // OnBuild() } isLiveBuild = (IsDlgButtonChecked(IDC_CREATE_LIVE_BUILD) == BST_CHECKED); + CString afterBuild = _T("0"); + CButton* pCopyToDevice = (CButton*)GetDlgItem(IDC_COPY_TO_DEVICE); + CButton* pShowInFiles = (CButton*)GetDlgItem(IDC_SHOW_IN_FILES); + if (pCopyToDevice->GetCheck() == BST_CHECKED) + afterBuild = _T("2"); + else if (pShowInFiles->GetCheck() == BST_CHECKED) + afterBuild = _T("1"); + // Store field settings to project. m_pProject->SetName(sAppName); m_pProject->SetAndroidVersionCode(iVersionCode); @@ -736,6 +738,7 @@ void CBuildAndroidDlg::OnOK() // OnBuild() m_pProject->SetSaveDir(sBuildDir); m_pProject->SetTargetOS(_T("Android 2.3.3")); // <- This string is only used by logging/analytics. m_pProject->SetCreateLiveBuild(isLiveBuild); + m_pProject->SetAfterBuild(afterBuild); // Update global build settings in registry. stringBuffer.SetUTF8(pTargetStore->GetStringId()); @@ -812,14 +815,30 @@ void CBuildAndroidDlg::OnOK() // OnBuild() return; } + //After Build Options + if (afterBuild == AB_COPY_TO_DEVICE) // Copy to Device + { + CString apkPath = m_pProject->GetSaveDir() + _T("\\") + m_pProject->GetName() + _T(".apk"); // apk path + if (PathFileExists(apkPath)) { // check if apk exist (may be aab) + Exec(_T("cd C:\\Program Files (x86)\\Corona Labs\\Corona\\adb & adb install -r \"") + apkPath + _T("\" & adb logcat Corona:v *:s")); // install apk and print logs + } + else { // apk not installed + DisplayWarningMessage(IDS_APK_NOT_FOUND); + } + + } + else if (afterBuild == AB_SHOW_IN_FILES) + { + ShellExecute(NULL, _T("open"), m_pProject->GetSaveDir(), NULL, NULL, SW_SHOWNORMAL); + } // The build has succeeded. Inform the user. - CMessageDlg messageDlg(this); - messageDlg.SetText( IDS_BUILD_SUCCEEDED ); - messageDlg.SetDefaultText( IDS_DONE ); - messageDlg.SetAltText( IDS_VIEW_EXPLORER ); - messageDlg.SetFolder( m_pProject->GetSaveDir() ); - messageDlg.SetIconStyle( MB_ICONINFORMATION ); - messageDlg.DoModal(); + CMessageDlg messageDlg(this); + messageDlg.SetText(IDS_BUILD_SUCCEEDED); + messageDlg.SetDefaultText(IDS_DONE); + //messageDlg.SetAltText( IDS_VIEW_EXPLORER ); //Remove because we give user a choice already + //messageDlg.SetFolder( m_pProject->GetSaveDir() ); + messageDlg.SetIconStyle(MB_ICONINFORMATION); + messageDlg.DoModal(); // Add the project to the Corona Live Server list, if enabled. if (isLiveBuild) @@ -833,6 +852,8 @@ void CBuildAndroidDlg::OnOK() // OnBuild() catch (...) {} } + + // Close this window. CDialog::OnOK(); } @@ -900,7 +921,7 @@ void CALLBACK CBuildAndroidDlg::HelpCallback(LPHELPINFO lpHelpInfo) catch (...) {} } -UINT CBuildAndroidDlg::DisplayWarningMessageWithHelp(UINT nTitleID, UINT nMessageID, CString helpURL) +UINT CBuildAndroidDlg::DisplayWarningMessageWithHelp(UINT nTitleID, UINT nMessageID, CString helpURL, bool isYesNo) { MSGBOXPARAMS mbp; CString title; @@ -920,8 +941,13 @@ UINT CBuildAndroidDlg::DisplayWarningMessageWithHelp(UINT nTitleID, UINT nMessag // if you wanted to specify a different caption, here is where you do it mbp.lpszCaption = title; - - mbp.dwStyle = MB_YESNO | MB_ICONWARNING | MB_HELP; + if (isYesNo) { //default YES NO + mbp.dwStyle = MB_YESNO | MB_ICONWARNING | MB_HELP; + } + else { + mbp.dwStyle = MB_ICONWARNING | MB_HELP; + } + // mbp.lpszIcon = ; // note, you could provide your own custom ICON here! @@ -932,36 +958,6 @@ UINT CBuildAndroidDlg::DisplayWarningMessageWithHelp(UINT nTitleID, UINT nMessag return ::MessageBoxIndirect(&mbp); } -#ifdef AUTO_INCLUDE_MONETIZATION_PLUGIN -// Called when the user changes the "Enable Monetization" checkbox -void CBuildAndroidDlg::OnBnClickedEnableMonetization() -{ - CButton *enableMonetizationBtn = (CButton *) GetDlgItem(IDC_ENABLE_MONETIZATION); - - // If they uncheck the box, ask them if they are sure - if (enableMonetizationBtn->GetCheck() == BST_UNCHECKED) - { - CString title; - CString message; - DWORD answer = IDNO; - - title.LoadString(IDS_ENABLE_MONETIZATION); - message.LoadString(IDS_MONETIZATION_WARNING); - //answer = MessageBox(message, title, MB_YESNO | MB_ICONWARNING | MB_HELP); - answer = DisplayWarningMessageWithHelp(IDS_ENABLE_MONETIZATION, IDS_MONETIZATION_WARNING, L"https://fusepowered.com/corona"); - - // The dialog asks whether they really want to disable monetization so - // if they answer "No" we need to re-check the checkbox - if (answer == IDNO) - { - enableMonetizationBtn->SetCheck(BST_CHECKED); - } - } - - m_pProject->SetEnableMonetization((enableMonetizationBtn->GetCheck() == BST_CHECKED)); -} -#endif // AUTO_INCLUDE_MONETIZATION_PLUGIN - void CBuildAndroidDlg::OnBnClickedCreateLiveBuild() diff --git a/platform/windows/Corona.Simulator/BuildAndroidDlg.h b/platform/windows/Corona.Simulator/BuildAndroidDlg.h index dde2db719..24b0a24c4 100644 --- a/platform/windows/Corona.Simulator/BuildAndroidDlg.h +++ b/platform/windows/Corona.Simulator/BuildAndroidDlg.h @@ -85,12 +85,8 @@ class CBuildAndroidDlg : public CDialog CString GetTrialKeyAliasPassword(); void DisplayWarningMessage(UINT nMessageID); void DisplayWarningMessage(UINT nMessageID, CString filename); // override with additional info - UINT DisplayWarningMessageWithHelp(UINT nTitleID, UINT nMessageID, CString helpURL); + UINT DisplayWarningMessageWithHelp(UINT nTitleID, UINT nMessageID, CString helpURL, bool isYesNo = true); static void CALLBACK CBuildAndroidDlg::HelpCallback(LPHELPINFO lpHelpInfo); -#ifdef AUTO_INCLUDE_MONETIZATION_PLUGIN -public: - afx_msg void OnBnClickedEnableMonetization(); -#endif afx_msg void OnBnClickedCreateLiveBuild(); void LogAnalytics(const char *eventName, const char *key = NULL, const char *value = NULL); diff --git a/platform/windows/Corona.Simulator/CoronaProject.cpp b/platform/windows/Corona.Simulator/CoronaProject.cpp index 449ea4477..aff13b20a 100644 --- a/platform/windows/Corona.Simulator/CoronaProject.cpp +++ b/platform/windows/Corona.Simulator/CoronaProject.cpp @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // // This file is part of the Corona game engine. -// For overview and more information on licensing please refer to README.md +// For overview and more information on licensing please refer to README.md // Home page: https://github.com/coronalabs/corona // Contact: support@coronalabs.com // @@ -224,9 +224,10 @@ CCoronaProject::RegistryGet( CString sSection ) // Third argument is what this is a password for, not value of password m_KeystorePassword.RegistryGet( sSection, REGISTRY_KEYSTOREPWD, GetKeystorePath() ); - m_AliasPassword.RegistryGet( sSection, REGISTRY_ALIASPWD, GetAlias() ); + m_AliasPassword.RegistryGet( sSection, REGISTRY_ALIASPWD, GetAlias() ); stringBuffer = pApp->GetProfileString(sSection, REGISTRY_CREATE_LIVE_BUILD, REGISTRY_CREATE_LIVE_BUILD_DEFAULT); m_CreateLiveBuild = _ttoi(stringBuffer) ? true : false; + m_sAfterBuild = pApp->GetProfileString( sSection, REGISTRY_AFTER_BUILD ); #ifdef AUTO_INCLUDE_MONETIZATION_PLUGIN stringBuffer = pApp->GetProfileString(sSection, REGISTRY_ENABLE_MONETIZATION, REGISTRY_ENABLE_MONETIZATION_DEFAULT); m_EnableMonetization = _ttoi(stringBuffer) ? true : false; @@ -262,6 +263,8 @@ CCoronaProject::RegistryPut( CString sSection ) m_AliasPassword.RegistryPut(sSection, REGISTRY_ALIASPWD, GetAlias()); stringBuffer.Format(_T("%d"), m_CreateLiveBuild); pApp->WriteProfileString(sSection, REGISTRY_CREATE_LIVE_BUILD, stringBuffer); + + pApp->WriteProfileString( sSection, REGISTRY_AFTER_BUILD, m_sAfterBuild ); #ifdef AUTO_INCLUDE_MONETIZATION_PLUGIN stringBuffer.Format(_T("%d"), m_EnableMonetization); pApp->WriteProfileString(sSection, REGISTRY_ENABLE_MONETIZATION, stringBuffer); @@ -356,7 +359,7 @@ CCoronaProject::ValidatePackage( CString sPackage ) if( (nextPeriod == 0) // starting with period || (nextPeriod == length - 1) // ending with period || (nextPeriod == prevPeriod + 1 ) // two periods in a row - || ! allalphanum( sPackage, prevPeriod + 1, nextPeriod - 1) + || ! allalphanum( sPackage, prevPeriod + 1, nextPeriod - 1) || isJavaReservedWord( sPackage, prevPeriod + 1, nextPeriod - 1) ) { bCorrect = false; @@ -396,7 +399,7 @@ CCoronaProject::allalphanum( CString string, int start, int end ) return true; } -// isJavaReservedWord - return true if all the characters between start and end, inclusive, +// isJavaReservedWord - return true if all the characters between start and end, inclusive, // form a Java reserved word. http://www.javacamp.org/javaI/reservedWords.html // Note that case matters: "interface" is reserved, but "Interface" isn't. bool @@ -566,6 +569,15 @@ void CCoronaProject::SetCreateLiveBuild(bool createLiveBuild) m_CreateLiveBuild = createLiveBuild; } +CString CCoronaProject::GetAfterBuild() +{ + return m_sAfterBuild; +} +void CCoronaProject::SetAfterBuild(CString afterBuild) +{ + m_sAfterBuild = afterBuild; +} + #ifdef AUTO_INCLUDE_MONETIZATION_PLUGIN bool CCoronaProject::GetEnableMonetization() { @@ -681,7 +693,7 @@ CEncryptedKeeper::RegistryPut( CString sSection, CString sKey, CString sMatch ) ClearCurrent(); } // Re-save of same data, could be to different registry location - else if( m_aSavedData != NULL && m_nSavedData > 0 ) + else if( m_aSavedData != NULL && m_nSavedData > 0 ) { pApp->WriteProfileBinary( sSection, sKey, m_aSavedData, m_nSavedData ); } @@ -716,7 +728,7 @@ CEncryptedKeeper::ClearSaved() } // ClearAll - clear both current and saved data -void +void CEncryptedKeeper::ClearAll() { ClearCurrent(); @@ -738,7 +750,7 @@ void CEncryptedKeeper::EncryptString( CString sSecret, BYTE **paBytes, UINT *pnB // byte character sets. unencryptedData.cbData = (sSecret.GetLength() + 1) * sizeof( sSecret[0] ); if (!CryptProtectData( - &unencryptedData, + &unencryptedData, _T("Marker"), NULL, NULL, @@ -763,7 +775,7 @@ void CEncryptedKeeper::EncryptString( CString sSecret, BYTE **paBytes, UINT *pnB CString CEncryptedKeeper::DecryptString( BYTE *aBytes, UINT nBytes ) { DATA_BLOB encryptedData, unencryptedData; - + encryptedData.pbData = aBytes; encryptedData.cbData = nBytes; LPWSTR dataDescription; // Receives the description saved with data @@ -784,7 +796,7 @@ CString CEncryptedKeeper::DecryptString( BYTE *aBytes, UINT nBytes ) // NOTE: Contains NULL terminator CString sSecret( (LPCTSTR) unencryptedData.pbData, unencryptedData.cbData ); - + // Cleanup LocalFree(unencryptedData.pbData); diff --git a/platform/windows/Corona.Simulator/CoronaProject.h b/platform/windows/Corona.Simulator/CoronaProject.h index 3fc8e08f0..242712d92 100644 --- a/platform/windows/Corona.Simulator/CoronaProject.h +++ b/platform/windows/Corona.Simulator/CoronaProject.h @@ -1,7 +1,7 @@ ////////////////////////////////////////////////////////////////////////////// // // This file is part of the Corona game engine. -// For overview and more information on licensing please refer to README.md +// For overview and more information on licensing please refer to README.md // Home page: https://github.com/coronalabs/corona // Contact: support@coronalabs.com // @@ -45,6 +45,7 @@ #define REGISTRY_ALIAS_DEFAULT _T("") #define REGISTRY_SAVEDIR_DEFAULT _T("") #define REGISTRY_CREATE_LIVE_BUILD_DEFAULT _T("0") +#define REGISTRY_AFTER_BUILD _T("0") #define REGISTRY_ENABLE_MONETIZATION_DEFAULT _T("1") /////////////////////////////////////////////////////////////////////////////// @@ -66,7 +67,7 @@ class CEncryptedKeeper : public CObject void SetSave( bool bSave ) { m_bSaveToRegistry = bSave; } void RegistryGet( CString sSection, CString sKey, CString sMatch ); - void RegistryPut( CString sSection, CString sKey, CString sMatch ); + void RegistryPut( CString sSection, CString sKey, CString sMatch ); void ClearCurrent(); void ClearSaved(); @@ -163,6 +164,8 @@ class CCoronaProject : bool GetCreateLiveBuild(); void SetCreateLiveBuild(bool createLiveBuild); + CString GetAfterBuild(); + void SetAfterBuild(CString afterBuild); #ifdef AUTO_INCLUDE_MONETIZATION_PLUGIN bool GetEnableMonetization(); @@ -219,10 +222,11 @@ class CCoronaProject : bool m_CreateLiveBuild; + CString m_sAfterBuild; + #ifdef AUTO_INCLUDE_MONETIZATION_PLUGIN bool m_EnableMonetization; #endif bool m_sCreateFBInstantArchive; }; - diff --git a/platform/windows/Corona.Simulator/Resource.h b/platform/windows/Corona.Simulator/Resource.h index d19b79285..84650b552 100644 --- a/platform/windows/Corona.Simulator/Resource.h +++ b/platform/windows/Corona.Simulator/Resource.h @@ -232,6 +232,7 @@ #define IDS_ANDROID_BUILD 675 #define IDS_ANDROID_SDK_LICENSE 676 #define IDS_BUILD_NMETA_NAME_NOT_PROVIDED 677 +#define IDS_APK_NOT_FOUND 678 #define IDC_LINK_ANSCAMOBILE 1000 #define IDC_BUILD_APPNAME 1001 #define IDC_BUILD_VERSION_CODE 1002 @@ -320,6 +321,10 @@ #define IDC_INCLUDE_STANDART_RESOURCES 1104 #define IDC_CREATE_FB_INSTANT_ARCHIVE 1105 #define IDC_BUILD_NMETA_PATH 1106 +#define IDC_ON_COMPLETE_OPTIONS 1107 +#define IDC_COPY_TO_DEVICE 1108 +#define IDC_SHOW_IN_FILES 1109 +#define IDC_DO_NOTHING 1110 #define ID_Menu 32771 #define ID_FILE_OPENFORBUILD 32772 #define ID_FILE_RELAUNCH 32774 @@ -362,6 +367,8 @@ #define ID_VIEWAS_CUSTOMDEVICE 32998 #define ID_VIEWAS_END 32999 + + // Next default values for new objects // #ifdef APSTUDIO_INVOKED diff --git a/platform/windows/Corona.Simulator/Simulator.cpp b/platform/windows/Corona.Simulator/Simulator.cpp index f23cc6feb..2b9aa715c 100644 --- a/platform/windows/Corona.Simulator/Simulator.cpp +++ b/platform/windows/Corona.Simulator/Simulator.cpp @@ -12,6 +12,9 @@ #include #include #include +#include +#include +#include #include "Simulator.h" #include "MainFrm.h" diff --git a/platform/windows/Corona.Simulator/Simulator.h b/platform/windows/Corona.Simulator/Simulator.h index 46dc47ae2..389432b74 100644 --- a/platform/windows/Corona.Simulator/Simulator.h +++ b/platform/windows/Corona.Simulator/Simulator.h @@ -37,6 +37,11 @@ #define SIM_SHAKE_REPS 7 #define SIM_SHAKE_PERIOD 80 // msec +// After Build Types +#define AB_DO_NOTHING "0" +#define AB_SHOW_IN_FILES "1" +#define AB_COPY_TO_DEVICE "2" + // Define all registry items here #define REGISTRY_SECTION _T("Preferences") #define REGISTRY_WORKINGDIR _T("WorkingDir") diff --git a/platform/windows/Corona.Simulator/Simulator.rc b/platform/windows/Corona.Simulator/Simulator.rc old mode 100755 new mode 100644 index 3bf66cef3..f1293080b --- a/platform/windows/Corona.Simulator/Simulator.rc +++ b/platform/windows/Corona.Simulator/Simulator.rc @@ -277,7 +277,7 @@ BEGIN LTEXT "",IDC_ABOUT_VERSION,39,26,160,8 END -IDD_BUILD_DROID DIALOGEX 0, 0, 313, 218 +IDD_BUILD_DROID DIALOGEX 0, 0, 313, 280 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_CONTEXTHELP CAPTION "Android Build Setup" @@ -305,9 +305,12 @@ BEGIN EDITTEXT IDC_BUILD_SAVETO,90,170,156,14,ES_AUTOHSCROLL PUSHBUTTON "Browse...",IDC_BUILD_BROWSE_SAVETO,252,170,54,14 CONTROL "Create &Live Build",IDC_CREATE_LIVE_BUILD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,90,187,81,10 - CONTROL "Enable Monetization",IDC_ENABLE_MONETIZATION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,90,199,81,10 - DEFPUSHBUTTON "Build",IDOK,204,197,48,14 - PUSHBUTTON "Cancel",IDCANCEL,258,197,48,14 + GROUPBOX "After Build:", IDC_ON_COMPLETE_OPTIONS, 90, 205, 90, 70 + CONTROL "Copy to device",IDC_COPY_TO_DEVICE,"BUTTON", BS_AUTORADIOBUTTON, 94, 220, 81, 10 + CONTROL "Show in File Explorer", IDC_SHOW_IN_FILES,"BUTTON", BS_AUTORADIOBUTTON, 94, 240, 81, 10 + CONTROL "Do nothing", IDC_DO_NOTHING,"BUTTON", BS_AUTORADIOBUTTON, 94, 260, 81, 10 + DEFPUSHBUTTON "Build",IDOK,204,260,48,14 + PUSHBUTTON "Cancel",IDCANCEL,258,260,48,14 END IDD_PASSWORD DIALOGEX 0, 0, 169, 106 @@ -856,6 +859,7 @@ BEGIN IDS_ANDROID_BUILD "Building Android App" IDS_ANDROID_SDK_LICENSE """You are about to build an Android app for the first time with this build system.\nIt uses the Android SDK and you must read and accept its license agreement in order to proceed.\nNote, the first time it will download about 250Mb which can take several minutes.\nPress 'Yes' to accept, 'No' to decline or 'Help' to read the license agreement.""" IDS_BUILD_NMETA_NAME_NOT_PROVIDED "You must provide path to .nmeta file." + IDS_APK_NOT_FOUND "APK not found for build, so cannot install on device" END STRINGTABLE