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"/>