diff --git a/.vsts-ci.Windows.yml b/.vsts-ci.Windows.yml index 6eaab640..a1c635bc 100644 --- a/.vsts-ci.Windows.yml +++ b/.vsts-ci.Windows.yml @@ -27,6 +27,48 @@ jobs: logProjectEvents: false createLogFile: false + - task: MSBuild@1 + displayName: ARM Android build + inputs: + solution: src/CalcManager.Android/CalcManager.Android.vcxproj + msbuildLocationMethod: version + msbuildVersion: latest + msbuildArchitecture: x86 + msbuildArguments: /r /p:Configuration=Release /p:Platform=ARM /detailedsummary + clean: false + maximumCpuCount: true + restoreNugetPackages: false + logProjectEvents: false + createLogFile: false + + - task: MSBuild@1 + displayName: ARM64 Android build + inputs: + solution: src/CalcManager.Android/CalcManager.Android.vcxproj + msbuildLocationMethod: version + msbuildVersion: latest + msbuildArchitecture: x86 + msbuildArguments: /r /p:Configuration=Release /p:Platform=ARM64 /detailedsummary + clean: false + maximumCpuCount: true + restoreNugetPackages: false + logProjectEvents: false + createLogFile: false + + - task: MSBuild@1 + displayName: X86 Android build + inputs: + solution: src/CalcManager.Android/CalcManager.Android.vcxproj + msbuildLocationMethod: version + msbuildVersion: latest + msbuildArchitecture: x86 + msbuildArguments: /r /p:Configuration=Release /p:Platform=x86 /detailedsummary + clean: false + maximumCpuCount: true + restoreNugetPackages: false + logProjectEvents: false + createLogFile: false + - task: MSBuild@1 inputs: solution: src/Calculator.sln @@ -39,6 +81,36 @@ jobs: restoreNugetPackages: false logProjectEvents: false createLogFile: false + + - task: CopyFiles@2 + displayName: 'Publish Wasm Binaries' + inputs: + SourceFolder: $(build.sourcesdirectory)/src/Calculator.Wasm/bin/Release/netstandard2.0/dist + Contents: '**/*.*' + TargetFolder: $(build.artifactstagingdirectory)/wasm-interp + CleanTargetFolder: false + OverWrite: false + flattenFolders: false + + - task: CopyFiles@2 + displayName: 'Publish Android Binaries' + inputs: + SourceFolder: $(build.sourcesdirectory)/src/Calculator.Droid/bin/Release + Contents: '**/*.apk' + TargetFolder: $(build.artifactstagingdirectory)/android + CleanTargetFolder: false + OverWrite: false + flattenFolders: false + + - task: CopyFiles@2 + displayName: 'Publish Windows Binaries' + inputs: + SourceFolder: $(build.sourcesdirectory)/src/Calculator.UWP/AppPackages + Contents: '**/*.*' + TargetFolder: $(build.artifactstagingdirectory)/windows + CleanTargetFolder: false + OverWrite: false + flattenFolders: false - task: PublishBuildArtifacts@1 displayName: Publish Package Artifacts diff --git a/src/CalcManager.Android/CalcManager.Android.vcxproj b/src/CalcManager.Android/CalcManager.Android.vcxproj new file mode 100644 index 00000000..9b9c131e --- /dev/null +++ b/src/CalcManager.Android/CalcManager.Android.vcxproj @@ -0,0 +1,295 @@ + + + + + Debug + ARM + + + Release + ARM + + + Debug + ARM64 + + + Release + ARM64 + + + Debug + x64 + + + Release + x64 + + + Debug + x86 + + + Release + x86 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {08a1283c-522b-4820-8c56-361638a82e24} + Android + CalcManager + 14.0 + Android + 3.0 + + + + DynamicLibrary + true + Clang_5_0 + android-27 + + + DynamicLibrary + false + Clang_5_0 + android-27 + + + DynamicLibrary + true + Clang_5_0 + android-27 + + + DynamicLibrary + false + Clang_5_0 + android-27 + + + DynamicLibrary + true + Clang_5_0 + android-27 + + + DynamicLibrary + false + Clang_5_0 + android-27 + + + DynamicLibrary + true + Clang_5_0 + android-27 + + + DynamicLibrary + false + Clang_5_0 + android-27 + + + + + + + + ../Calculator.Droid/libs/$(Platform)/$(Configuration)/ + + + ../Calculator.Droid/libs/$(Platform)/$(Configuration)/ + + + ../Calculator.Droid/libs/$(Platform)/$(Configuration)/ + + + ../Calculator.Droid/libs/$(Platform)/$(Configuration)/ + + + ../Calculator.Droid/libs/$(Platform)/$(Configuration)/ + + + ../Calculator.Droid/libs/$(Platform)/$(Configuration)/ + + + ../Calculator.Droid/libs/$(Platform)/$(Configuration)/ + + + ../Calculator.Droid/libs/$(Platform)/$(Configuration)/ + + + + Use + ../CalcManager/pch.h + Enabled + c++1z + ..;../CalcManager;$(StlIncludeDirectories);$(Sysroot)/usr/include;$(Sysroot)/usr/include/$(AndroidHeaderTriple);$(VS_NdkRoot)/sources/android/support/include;$(SolutionDir)./CalcManager/;%(AdditionalIncludeDirectories) + -Wno-unknown-pragmas -Wno-missing-braces %(AdditionalOptions) + + + true + -lm + + + + + Use + ../CalcManager/pch.h + c++1z + ..;../CalcManager;$(StlIncludeDirectories);$(Sysroot)/usr/include;$(Sysroot)/usr/include/$(AndroidHeaderTriple);$(VS_NdkRoot)/sources/android/support/include;$(SolutionDir)./CalcManager/;%(AdditionalIncludeDirectories) + Enabled + -Wno-unknown-pragmas -Wno-missing-braces %(AdditionalOptions) + + + true + -lm + + + + + Use + ../CalcManager/pch.h + c++1z + ..;../CalcManager;$(StlIncludeDirectories);$(Sysroot)/usr/include;$(Sysroot)/usr/include/$(AndroidHeaderTriple);$(VS_NdkRoot)/sources/android/support/include;$(SolutionDir)./CalcManager/;%(AdditionalIncludeDirectories) + Enabled + -Wno-unknown-pragmas -Wno-missing-braces %(AdditionalOptions) + + + true + -lm + + + + + Use + ../CalcManager/pch.h + c++1z + ..;../CalcManager;$(StlIncludeDirectories);$(Sysroot)/usr/include;$(Sysroot)/usr/include/$(AndroidHeaderTriple);$(VS_NdkRoot)/sources/android/support/include;$(SolutionDir)./CalcManager/;%(AdditionalIncludeDirectories) + Enabled + -Wno-unknown-pragmas -Wno-missing-braces %(AdditionalOptions) + + + true + -lm + + + + + Use + ../CalcManager/pch.h + c++1z + ..;../CalcManager;$(StlIncludeDirectories);$(Sysroot)/usr/include;$(Sysroot)/usr/include/$(AndroidHeaderTriple);$(VS_NdkRoot)/sources/android/support/include;$(SolutionDir)./CalcManager/;%(AdditionalIncludeDirectories) + Enabled + -Wno-unknown-pragmas -Wno-missing-braces %(AdditionalOptions) + + + true + -lm + + + + + Use + ../CalcManager/pch.h + c++1z + ..;../CalcManager;$(StlIncludeDirectories);$(Sysroot)/usr/include;$(Sysroot)/usr/include/$(AndroidHeaderTriple);$(VS_NdkRoot)/sources/android/support/include;$(SolutionDir)./CalcManager/;%(AdditionalIncludeDirectories) + Enabled + -Wno-unknown-pragmas -Wno-missing-braces %(AdditionalOptions) + + + true + -lm + + + + + Use + ../CalcManager/pch.h + c++1z + ..;../CalcManager;$(StlIncludeDirectories);$(Sysroot)/usr/include;$(Sysroot)/usr/include/$(AndroidHeaderTriple);$(VS_NdkRoot)/sources/android/support/include;$(SolutionDir)./CalcManager/;%(AdditionalIncludeDirectories) + Enabled + -Wno-unknown-pragmas -Wno-missing-braces %(AdditionalOptions) + + + true + -lm + + + + + Use + ../CalcManager/pch.h + c++1z + ..;../CalcManager;$(StlIncludeDirectories);$(Sysroot)/usr/include;$(Sysroot)/usr/include/$(AndroidHeaderTriple);$(VS_NdkRoot)/sources/android/support/include;$(SolutionDir)./CalcManager/;%(AdditionalIncludeDirectories) + Enabled + -Wno-unknown-pragmas -Wno-missing-braces %(AdditionalOptions) + + + true + -lm + + + + + \ No newline at end of file diff --git a/src/CalcManager.Android/CalcManager.Android.vcxproj.filters b/src/CalcManager.Android/CalcManager.Android.vcxproj.filters new file mode 100644 index 00000000..fba4455c --- /dev/null +++ b/src/CalcManager.Android/CalcManager.Android.vcxproj.filters @@ -0,0 +1,72 @@ + + + + + {8b6920ee-f524-4a48-837a-dba211bd5f7f} + + + {628c5935-02b4-4f8a-b4f4-3850e24c8e36} + + + {d346c535-3d9b-4cbf-a41e-b89243f563c0} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/CalcManager/CCalcManager.cpp b/src/CalcManager/CCalcManager.cpp index 448495fb..e8abad1d 100644 --- a/src/CalcManager/CCalcManager.cpp +++ b/src/CalcManager/CCalcManager.cpp @@ -384,14 +384,14 @@ void CalculatorManager_UpdateMaxIntDigits(void* manager) AsManager(manager)->UpdateMaxIntDigits(); } -const char* CalculatorManager_DecimalSeparator(void* manager) +const wchar_t* CalculatorManager_DecimalSeparator(void* manager) { auto res = AsManager(manager)->DecimalSeparator(); - std::wstring_convert> convert; - auto str = convert.to_bytes(res); + std::wstring ret; + ret += res; - return str.data(); + return ToWChar(ret); } bool CalculatorManager_RemoveHistoryItem(void* manager, int uIdx) diff --git a/src/CalcManager/CCalcManager.h b/src/CalcManager/CCalcManager.h index 7af758a3..caeaa493 100644 --- a/src/CalcManager/CCalcManager.h +++ b/src/CalcManager/CCalcManager.h @@ -41,8 +41,8 @@ struct CalculatorManager_CreateParams GetCEngineStringFunc GetCEngineString; }; -#if defined(__EMSCRIPTEN__) || defined(__APPLE__) -#define DLL_EXPORT +#if defined(__EMSCRIPTEN__) || defined(__APPLE__) || defined(__ANDROID__) +#define DLL_EXPORT #else #define DLL_EXPORT __declspec(dllexport) #endif @@ -101,7 +101,7 @@ extern "C" DLL_EXPORT const wchar_t* CalculatorManager_GetResultForRadix(void* manager, int radix, int precision); DLL_EXPORT void CalculatorManager_SetPrecision(void* manager, int precision); DLL_EXPORT void CalculatorManager_UpdateMaxIntDigits(void* manager); - DLL_EXPORT const char* CalculatorManager_DecimalSeparator(void* manager); + DLL_EXPORT const wchar_t* CalculatorManager_DecimalSeparator(void* manager); DLL_EXPORT bool CalculatorManager_RemoveHistoryItem(void* manager, int uIdx); DLL_EXPORT void CalculatorManager_ClearHistory(void* manager); DLL_EXPORT size_t CalculatorManager_MaxHistorySize(void* manager); diff --git a/src/CalcManager/CalculatorManager.cpp b/src/CalcManager/CalculatorManager.cpp index c30cad2a..27735a60 100644 --- a/src/CalcManager/CalculatorManager.cpp +++ b/src/CalcManager/CalculatorManager.cpp @@ -14,7 +14,7 @@ static constexpr size_t SERIALIZED_NUMBER_MINSIZE = 3; // Converts Memory Command enum value to unsigned char, // while ignoring Warning C4309: 'conversion' : truncation of constant value -#if defined(__EMSCRIPTEN__) || defined(__APPLE__) +#if defined(__EMSCRIPTEN__) || defined(__APPLE__) || defined(__ANDROID__) #define MEMORY_COMMAND_TO_UNSIGNED_CHAR(c) static_cast(c) #else #define MEMORY_COMMAND_TO_UNSIGNED_CHAR(c) __pragma(warning(push)) __pragma(warning(disable : 4309)) static_cast(c) __pragma(warning(pop)) diff --git a/src/CalcManager/CalculatorVector.h b/src/CalcManager/CalculatorVector.h index ed9f213c..cf75a80b 100644 --- a/src/CalcManager/CalculatorVector.h +++ b/src/CalcManager/CalculatorVector.h @@ -10,7 +10,7 @@ #include "Ratpack/CalcErr.h" #include // for std::out_of_range -#if !defined(__EMSCRIPTEN__) && !defined(__APPLE__) +#if !defined(__EMSCRIPTEN__) && !defined(__APPLE__) && !defined(__ANDROID__) #include #include // for SAL #endif diff --git a/src/CalcManager/compat.h b/src/CalcManager/compat.h index 7ffeec1a..74920e4f 100644 --- a/src/CalcManager/compat.h +++ b/src/CalcManager/compat.h @@ -1,6 +1,6 @@ #pragma once -#if defined(__EMSCRIPTEN__) || defined(__APPLE__) +#if defined(__EMSCRIPTEN__) || defined(__APPLE__) || defined(__ANDROID__) #define HRESULT long #define _In_opt_ diff --git a/src/CalcManager/pch.h b/src/CalcManager/pch.h index cab9e5f7..4abe2ad9 100644 --- a/src/CalcManager/pch.h +++ b/src/CalcManager/pch.h @@ -18,7 +18,7 @@ #include #include -#if !defined(__EMSCRIPTEN__) && !defined(__APPLE__) +#if !defined(__EMSCRIPTEN__) && !defined(__APPLE__) && !defined(__ANDROID__) #include #include #include diff --git a/src/Calculator.Droid/Assets/CalcMDL2.ttf b/src/Calculator.Droid/Assets/CalcMDL2.ttf new file mode 100644 index 00000000..a4b8862c Binary files /dev/null and b/src/Calculator.Droid/Assets/CalcMDL2.ttf differ diff --git a/src/Calculator.Droid/Calculator.Droid.csproj b/src/Calculator.Droid/Calculator.Droid.csproj index 39066a19..b3d5cee5 100644 --- a/src/Calculator.Droid/Calculator.Droid.csproj +++ b/src/Calculator.Droid/Calculator.Droid.csproj @@ -16,7 +16,7 @@ Resources\Resource.Designer.cs Off False - v8.0 + v9.0 Properties\AndroidManifest.xml True ..\Calculator.Shared\Strings @@ -68,6 +68,7 @@ + @@ -83,13 +84,25 @@ - + + + armeabi-v7a + + + arm64-v8a + + + x86 + + + - - \ No newline at end of file + diff --git a/src/Calculator.Droid/Main.cs b/src/Calculator.Droid/Main.cs index 555b313a..4623a68f 100644 --- a/src/Calculator.Droid/Main.cs +++ b/src/Calculator.Droid/Main.cs @@ -12,7 +12,7 @@ using Android.Widget; using Com.Nostra13.Universalimageloader.Core; using Windows.UI.Xaml.Media; -namespace WindowsCalculator.Droid +namespace CalculatorApp.Droid { [global::Android.App.ApplicationAttribute( Label = "@string/ApplicationName", diff --git a/src/Calculator.Droid/MainActivity.cs b/src/Calculator.Droid/MainActivity.cs index 94ad503c..7907d33d 100644 --- a/src/Calculator.Droid/MainActivity.cs +++ b/src/Calculator.Droid/MainActivity.cs @@ -4,7 +4,7 @@ using Android.OS; using Android.Content.PM; using Android.Views; -namespace WindowsCalculator.Droid +namespace CalculatorApp.Droid { [Activity( MainLauncher = true, diff --git a/src/Calculator.Droid/Properties/AndroidManifest.xml b/src/Calculator.Droid/Properties/AndroidManifest.xml index f789a779..590aa4a3 100644 --- a/src/Calculator.Droid/Properties/AndroidManifest.xml +++ b/src/Calculator.Droid/Properties/AndroidManifest.xml @@ -1,5 +1,5 @@  - - + + \ No newline at end of file diff --git a/src/Calculator.Shared/CalcManager/CalculatorManager.Interop.cs b/src/Calculator.Shared/CalcManager/CalculatorManager.Interop.cs index 90de0552..b1cf2f04 100644 --- a/src/Calculator.Shared/CalcManager/CalculatorManager.Interop.cs +++ b/src/Calculator.Shared/CalcManager/CalculatorManager.Interop.cs @@ -73,7 +73,7 @@ namespace CalculationManager public static extern void CalculatorManager_UpdateMaxIntDigits(IntPtr nativeManager); [DllImport(DllPath)] - public static extern char CalculatorManager_DecimalSeparator(IntPtr nativeManager); + public static extern IntPtr CalculatorManager_DecimalSeparator(IntPtr nativeManager); [DllImport(DllPath)] public static extern bool CalculatorManager_RemoveHistoryItem(IntPtr nativeManager, int uIdx); @@ -306,7 +306,7 @@ namespace CalculationManager internal static IntPtr StringToHGlobal(string resourceValue) { -#if __WASM__ || __IOS__ +#if __WASM__ || __IOS__ || __ANDROID__ // wchar_t is 32bits return StringToHGlobalUTF32(resourceValue); #else @@ -316,7 +316,7 @@ namespace CalculationManager internal static string PtrToString(IntPtr pResourceId) { -#if __WASM__ || __IOS__ +#if __WASM__ || __IOS__ || __ANDROID__ return PtrToStringUTF32(pResourceId); #else return Marshal.PtrToStringUni(pResourceId); diff --git a/src/Calculator.Shared/CalcManager/CalculatorManager.cs b/src/Calculator.Shared/CalcManager/CalculatorManager.cs index cfc919c8..2704e87a 100644 --- a/src/Calculator.Shared/CalcManager/CalculatorManager.cs +++ b/src/Calculator.Shared/CalcManager/CalculatorManager.cs @@ -4,6 +4,7 @@ using CalculatorApp; using System; using System.Collections.Generic; using System.Diagnostics; +using System.Linq; using System.Runtime.InteropServices; using System.Text; @@ -217,7 +218,10 @@ namespace CalculationManager => NativeDispatch.CalculatorManager_UpdateMaxIntDigits(_nativeManager); public char DecimalSeparator() - => NativeDispatch.CalculatorManager_DecimalSeparator(_nativeManager); + { + var pString = NativeDispatch.CalculatorManager_DecimalSeparator(_nativeManager); + return NativeDispatch.PtrToString(pString).FirstOrDefault(); + } public List GetHistoryItems() { diff --git a/src/Calculator.Shared/Controls/CalculationResult.cs b/src/Calculator.Shared/Controls/CalculationResult.cs index e2357a09..11f5b406 100644 --- a/src/Calculator.Shared/Controls/CalculationResult.cs +++ b/src/Calculator.Shared/Controls/CalculationResult.cs @@ -131,7 +131,7 @@ namespace CalculatorApp public static readonly DependencyProperty IsOperatorCommandProperty = DependencyProperty.Register("IsOperatorCommand", typeof(bool), typeof(CalculationResult), new PropertyMetadata(false)); - public event SelectedEventHandler Selected; + public event SelectedEventHandler ValueSelected; private Windows.UI.Xaml.Controls.ScrollViewer m_textContainer; @@ -532,7 +532,7 @@ namespace CalculatorApp void RaiseSelectedEvent() { - Selected?.Invoke(this); + ValueSelected?.Invoke(this); } }; } diff --git a/src/Calculator.Shared/Resources/en-US/Resources.resw b/src/Calculator.Shared/Resources/en-US/Resources.resw index 0ae88c70..06305043 100644 --- a/src/Calculator.Shared/Resources/en-US/Resources.resw +++ b/src/Calculator.Shared/Resources/en-US/Resources.resw @@ -394,7 +394,7 @@ {Locked}This is the value that comes from the VirtualKey enum that represents the button. This value is not localized and must be one value that comes from the Windows::System::VirtualKey enum. - @ + UNO_TODO_AMPERSAND {Locked}This is the character that should trigger this button. Note that it is a character and not a key, so it does not come from the Windows::System::VirtualKey enum. @@ -3387,4 +3387,4 @@ Pyeong A measurement unit for area. - \ No newline at end of file + diff --git a/src/Calculator.Shared/Styles.xaml b/src/Calculator.Shared/Styles.xaml index 15a910e4..afec18b1 100644 --- a/src/Calculator.Shared/Styles.xaml +++ b/src/Calculator.Shared/Styles.xaml @@ -272,10 +272,9 @@ 500 320 - ms-appx:///Assets/CalcMDL2.ttf#Calculator MDL2 Assets - Calculator MDL2 Assets + ms-appx:///Assets/CalcMDL2.ttf#Calculator MDL2 Assets - 256 + 256 0,1,0,0 15 SemiBold diff --git a/src/Calculator.Shared/ViewModels/StandardCalculatorViewModel.cs b/src/Calculator.Shared/ViewModels/StandardCalculatorViewModel.cs index 18d93169..abe58f16 100644 --- a/src/Calculator.Shared/ViewModels/StandardCalculatorViewModel.cs +++ b/src/Calculator.Shared/ViewModels/StandardCalculatorViewModel.cs @@ -574,7 +574,7 @@ namespace CalculatorApp.ViewModel m_decimalSeparator = LocalizationSettings.GetInstance().GetDecimalSeparator(); -#if !__WASM__ && !__IOS__ +#if !__WASM__ && !__IOS__ && !__ANDROID__ if (CoreWindow.GetForCurrentThread() != null) { // Must have a CoreWindow to access the resource context. diff --git a/src/Calculator.Shared/Views/UnitConverter.xaml b/src/Calculator.Shared/Views/UnitConverter.xaml index 03ad7a16..8af21067 100644 --- a/src/Calculator.Shared/Views/UnitConverter.xaml +++ b/src/Calculator.Shared/Views/UnitConverter.xaml @@ -504,7 +504,7 @@ FlowDirection="{x:Bind LayoutDirection}" IsActive="{Binding Value1Active, Mode=TwoWay}" KeyDown="OnValueKeyDown" - Selected="OnValueSelected" + ValueSelected="OnValueSelected" TabIndex="1"/>