diff --git a/MoCha/Assets/Pedometer.meta b/MoCha/Assets/Pedometer.meta new file mode 100644 index 0000000..e5f04d3 --- /dev/null +++ b/MoCha/Assets/Pedometer.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 7a73552b2c9c547dc8b9a92c15744bd8 +folderAsset: yes +timeCreated: 1497547079 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/MoCha/Assets/Pedometer/Editor.meta b/MoCha/Assets/Pedometer/Editor.meta new file mode 100644 index 0000000..ce34b3c --- /dev/null +++ b/MoCha/Assets/Pedometer/Editor.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 188f5c9ce0ac2439499a73685331a44d +folderAsset: yes +timeCreated: 1497553151 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/MoCha/Assets/Pedometer/Editor/PedometerEditor.cs b/MoCha/Assets/Pedometer/Editor/PedometerEditor.cs new file mode 100644 index 0000000..f6beef1 --- /dev/null +++ b/MoCha/Assets/Pedometer/Editor/PedometerEditor.cs @@ -0,0 +1,53 @@ +/* +* Pedometer +* Copyright (c) 2017 Yusuf Olokoba +*/ + +namespace PedometerU.Utilities { + + using UnityEditor; + using UnityEditor.Build; + using System; + using System.IO; + + #if UNITY_IOS + using UnityEditor.Callbacks; + using UnityEditor.iOS.Xcode; + #endif + + public class PedometerEditor : IPreprocessBuild, IPostprocessBuild, IOrderedCallback { + + private string AndroidPlugins {get {return Path.Combine(Environment.CurrentDirectory, "Assets/Plugins/Android");}} + int IOrderedCallback.callbackOrder {get {return 0;}} + + private const string + MotionUsageKey = @"NSMotionUsageDescription", + MotionUsageDescription = @"Allow this app to use the pedometer."; // Change this as necessary + + void IPreprocessBuild.OnPreprocessBuild(BuildTarget target, string path) { + #if UNITY_ANDROID + // Create the Android plugins directory + Directory.CreateDirectory(AndroidPlugins); + // Copy the manifest into it // This is the only place where Unity picks up manifests, so we have to copy into it + File.Copy(Path.Combine(Environment.CurrentDirectory, "Assets/Pedometer/Plugins/Android/AndroidManifest.xml"), Path.Combine(AndroidPlugins, "AndroidManifest.xml")); + #elif UNITY_IOS + // Get the property list + string plistPath = path + "/Info.plist"; + PlistDocument plist = new PlistDocument(); + // Read it + plist.ReadFromString(File.ReadAllText(plistPath)); + PlistElementDict rootDictionary = plist.root; + // Add the motion usage description + rootDictionary.SetString(MotionUsageKey, MotionUsageDescription); + File.WriteAllText(plistPath, plist.WriteToString()); + #endif + } + + void IPostprocessBuild.OnPostprocessBuild (BuildTarget target, string path) { + #if UNITY_ANDROID + // Delete the Android manifest from Plugins/Android + File.Delete(Path.Combine(AndroidPlugins, "AndroidManifest.xml")); + #endif + } + } +} \ No newline at end of file diff --git a/MoCha/Assets/Pedometer/Editor/PedometerEditor.cs.meta b/MoCha/Assets/Pedometer/Editor/PedometerEditor.cs.meta new file mode 100644 index 0000000..57dd850 --- /dev/null +++ b/MoCha/Assets/Pedometer/Editor/PedometerEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: dec45390b23614bf898574d3ef1a2278 +timeCreated: 1497553151 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/MoCha/Assets/Pedometer/Plugins.meta b/MoCha/Assets/Pedometer/Plugins.meta new file mode 100644 index 0000000..ee177cd --- /dev/null +++ b/MoCha/Assets/Pedometer/Plugins.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 16f5885743c8a4311b5892c1f5bc06ad +folderAsset: yes +timeCreated: 1497486100 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/MoCha/Assets/Pedometer/Plugins/Android.meta b/MoCha/Assets/Pedometer/Plugins/Android.meta new file mode 100644 index 0000000..b756517 --- /dev/null +++ b/MoCha/Assets/Pedometer/Plugins/Android.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f118efd25bcfb44008cbb6a4bd8d38aa +folderAsset: yes +timeCreated: 1497486100 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/MoCha/Assets/Pedometer/Plugins/Android/AndroidManifest.xml b/MoCha/Assets/Pedometer/Plugins/Android/AndroidManifest.xml new file mode 100644 index 0000000..01810c7 --- /dev/null +++ b/MoCha/Assets/Pedometer/Plugins/Android/AndroidManifest.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/MoCha/Assets/Pedometer/Plugins/Android/AndroidManifest.xml.meta b/MoCha/Assets/Pedometer/Plugins/Android/AndroidManifest.xml.meta new file mode 100644 index 0000000..26524dd --- /dev/null +++ b/MoCha/Assets/Pedometer/Plugins/Android/AndroidManifest.xml.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6d12e0df1fc5342fca4a7a81d9a17a2d +timeCreated: 1497486100 +licenseType: Pro +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/MoCha/Assets/Pedometer/Plugins/Android/Makefile b/MoCha/Assets/Pedometer/Plugins/Android/Makefile new file mode 100644 index 0000000..ab79838 --- /dev/null +++ b/MoCha/Assets/Pedometer/Plugins/Android/Makefile @@ -0,0 +1,16 @@ +# +# Pedometer +# Copyright (c) 2017 Yusuf Olokoba +# + +SDKLIB := /Users/yusuf/Documents/ADT/SDK/platforms/android-23/android.jar # Replace with your path to the Android base class library +UNITYLIB := /Applications/Unity/PlaybackEngines/AndroidPlayer/Variations/mono/Release/Classes/classes.jar # Replace with your path to Unity's classes.jar +SRC := PedometerActivity + +build: + @echo "Building..." + javac -source 1.6 -target 1.6 "$(SRC).java" -bootclasspath $(SDKLIB) -classpath $(UNITYLIB) -d . + jar cf "$(SRC).jar" com + @rm -rf com + @echo "Completed" + @echo "------------------------------------------------------ " \ No newline at end of file diff --git a/MoCha/Assets/Pedometer/Plugins/Android/Makefile.meta b/MoCha/Assets/Pedometer/Plugins/Android/Makefile.meta new file mode 100644 index 0000000..47af32d --- /dev/null +++ b/MoCha/Assets/Pedometer/Plugins/Android/Makefile.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 100f626688ea24b02a075800806d5cfc +timeCreated: 1497486100 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/MoCha/Assets/Pedometer/Plugins/Android/PedometerActivity.jar b/MoCha/Assets/Pedometer/Plugins/Android/PedometerActivity.jar new file mode 100644 index 0000000..ad19570 Binary files /dev/null and b/MoCha/Assets/Pedometer/Plugins/Android/PedometerActivity.jar differ diff --git a/MoCha/Assets/Pedometer/Plugins/Android/PedometerActivity.jar.meta b/MoCha/Assets/Pedometer/Plugins/Android/PedometerActivity.jar.meta new file mode 100644 index 0000000..84bf7a2 --- /dev/null +++ b/MoCha/Assets/Pedometer/Plugins/Android/PedometerActivity.jar.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 35031be768e094966bcd410de225237c +timeCreated: 1497556782 +licenseType: Pro +PluginImporter: + serializedVersion: 2 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + data: + first: + Android: Android + second: + enabled: 1 + settings: {} + data: + first: + Any: + second: + enabled: 0 + settings: {} + data: + first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/MoCha/Assets/Pedometer/Plugins/Android/PedometerActivity.java b/MoCha/Assets/Pedometer/Plugins/Android/PedometerActivity.java new file mode 100644 index 0000000..263b013 --- /dev/null +++ b/MoCha/Assets/Pedometer/Plugins/Android/PedometerActivity.java @@ -0,0 +1,69 @@ +package com.yusufolokoba.pedometer; + +import android.content.Context; +import android.hardware.Sensor; +import android.hardware.SensorEvent; +import android.hardware.SensorEventListener; +import android.hardware.SensorManager; +import android.content.pm.PackageManager; +import android.util.Log; +import com.unity3d.player.UnityPlayer; +import com.unity3d.player.UnityPlayerActivity; + +/** + * Pedometer + * Created by Yusuf on 06/14/17. + */ +public class PedometerActivity extends UnityPlayerActivity implements SensorEventListener { + + private Sensor sensor; + private SensorManager manager; + + //region --Client API-- + + public void initialize () { + // Get sensor manager + manager = manager == null ? (SensorManager)getSystemService(Context.SENSOR_SERVICE) : manager; + // Get sensor + if ((sensor = manager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER)) == null) { + Log.e("Unity", "Pedometer Error: Failed to acquire step counter sensor"); + return; + } + // Start listening + manager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_UI); + // Log + Log.d("Unity", "Pedometer: Initialized Android backend"); + } + + public void release () { + // Stop listening + manager.unregisterListener(this); + // Dereference + sensor = null; + // Log + Log.d("Unity", "Pedometer: Released Android backend"); + } + + public boolean isSupported () { + return getPackageManager().hasSystemFeature(PackageManager.FEATURE_SENSOR_STEP_COUNTER); + } + //endregion + + + //region --Callbacks-- + + @Override + public void onAccuracyChanged (Sensor sensor, int accuracy) {} + + @Override + public void onSensorChanged (SensorEvent event) { + // Extract data + final double + STEP2METERS = 0.715d, + steps = event.values[0], + distance = steps * STEP2METERS; + // Send to Unity + UnityPlayer.UnitySendMessage("Pedometer", "OnEvent", String.format("%d:%f", (int)steps, distance)); + } + //endregion +} diff --git a/MoCha/Assets/Pedometer/Plugins/Android/PedometerActivity.java.meta b/MoCha/Assets/Pedometer/Plugins/Android/PedometerActivity.java.meta new file mode 100644 index 0000000..e9aaaaf --- /dev/null +++ b/MoCha/Assets/Pedometer/Plugins/Android/PedometerActivity.java.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 691a262e9a06c47579c25a6838a5d097 +timeCreated: 1497547079 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/MoCha/Assets/Pedometer/Plugins/Managed.meta b/MoCha/Assets/Pedometer/Plugins/Managed.meta new file mode 100644 index 0000000..b624a91 --- /dev/null +++ b/MoCha/Assets/Pedometer/Plugins/Managed.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f76f71a93492f4ccd84fe17da32466a5 +folderAsset: yes +timeCreated: 1497488311 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/MoCha/Assets/Pedometer/Plugins/Managed/IPedometer.cs b/MoCha/Assets/Pedometer/Plugins/Managed/IPedometer.cs new file mode 100644 index 0000000..c1c77d0 --- /dev/null +++ b/MoCha/Assets/Pedometer/Plugins/Managed/IPedometer.cs @@ -0,0 +1,33 @@ +/* +* Pedometer +* Copyright (c) 2017 Yusuf Olokoba +*/ + +namespace PedometerU.Platforms { + + public interface IPedometer { + + #region --Properties-- + /// + /// Event used to propagate step events + /// + event StepCallback OnStep; + /// + /// Is this implementation supported by the current platform? + /// + bool IsSupported {get;} + #endregion + + + #region --Client API-- + /// + /// Initialize this Pedometer implementation + /// + IPedometer Initialize (); + /// + /// Teardown this Pedometer implementation and release any resources + /// + void Release (); + #endregion + } +} \ No newline at end of file diff --git a/MoCha/Assets/Pedometer/Plugins/Managed/IPedometer.cs.meta b/MoCha/Assets/Pedometer/Plugins/Managed/IPedometer.cs.meta new file mode 100644 index 0000000..63a79d7 --- /dev/null +++ b/MoCha/Assets/Pedometer/Plugins/Managed/IPedometer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 88d6047c336bd4e2b96e973d7f5e2cb6 +timeCreated: 1497547083 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/MoCha/Assets/Pedometer/Plugins/Managed/Pedometer.cs b/MoCha/Assets/Pedometer/Plugins/Managed/Pedometer.cs new file mode 100644 index 0000000..d0e3220 --- /dev/null +++ b/MoCha/Assets/Pedometer/Plugins/Managed/Pedometer.cs @@ -0,0 +1,94 @@ +/* +* Pedometer +* Copyright (c) 2017 Yusuf Olokoba +*/ + +namespace PedometerU { + + using Platforms; + using System; + using System.Linq; + + public sealed class Pedometer : IDisposable { + + #region --Properties-- + + /// + /// How many updates has this pedometer received? Useful for calculating pedometer precision + /// + public int updateCount {get; private set;} + + /// + /// Pedometer implementation for the current device. Do not use unless you know what you are doing + /// + public static IPedometer Implementation { + get { + return _Implementation = _Implementation ?? new IPedometer[] { + new PedometerAndroid(), + new PedometeriOS(), + new PedometerGPS() // Always supported, uses GPS (so highly inaccurate) + }.First(impl => impl.IsSupported).Initialize(); + } + } + private static IPedometer _Implementation; + #endregion + + + #region --Op vars-- + private int initialSteps; // Some step counters count from device boot, so subtract the initial count we get + private double initialDistance; + private readonly StepCallback callback; + #endregion + + + #region --Ctor-- + + /// + /// Create a new pedometer and start listening for updates + /// + public Pedometer (StepCallback callback) { + // Save the callback + this.callback = callback; + // Register callback + Implementation.OnStep += OnStep; + } + #endregion + + + #region --Operations-- + + /// + /// Stop listening for pedometer updates and dispose the object + /// + public void Dispose () { + // Unregister callback + Implementation.OnStep -= OnStep; + } + + /// + /// Release Pedometer and all of its resources + /// + public static void Release () { + if (_Implementation == null) return; + // Release and dereference + _Implementation.Release(); + _Implementation = null; + } + + private void OnStep (int steps, double distance) { // DEPLOY // UpdateCount post increment + // Set initials and increment update count + initialSteps = updateCount++ == 0 ? steps : initialSteps; + initialDistance = steps == initialSteps ? distance : initialDistance; + // If this is not the first step, then invoke the callback + if (steps != initialSteps) if (callback != null) callback(steps - initialSteps, distance - initialDistance); + } + #endregion + } + + /// + /// A delegate used to pass pedometer information + /// + /// Number of steps taken + /// Distance walked in meters + public delegate void StepCallback (int steps, double distance); +} \ No newline at end of file diff --git a/MoCha/Assets/Pedometer/Plugins/Managed/Pedometer.cs.meta b/MoCha/Assets/Pedometer/Plugins/Managed/Pedometer.cs.meta new file mode 100644 index 0000000..4ff810c --- /dev/null +++ b/MoCha/Assets/Pedometer/Plugins/Managed/Pedometer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c21bada5b411643bbac7a50e3505bfb4 +timeCreated: 1497547083 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/MoCha/Assets/Pedometer/Plugins/Managed/Platforms.meta b/MoCha/Assets/Pedometer/Plugins/Managed/Platforms.meta new file mode 100644 index 0000000..1adfba2 --- /dev/null +++ b/MoCha/Assets/Pedometer/Plugins/Managed/Platforms.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 977b4cd8abd1a471daca27683d9cca3a +folderAsset: yes +timeCreated: 1497488311 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/MoCha/Assets/Pedometer/Plugins/Managed/Platforms/PedometerAndroid.cs b/MoCha/Assets/Pedometer/Plugins/Managed/Platforms/PedometerAndroid.cs new file mode 100644 index 0000000..67bf272 --- /dev/null +++ b/MoCha/Assets/Pedometer/Plugins/Managed/Platforms/PedometerAndroid.cs @@ -0,0 +1,58 @@ +/* +* Pedometer +* Copyright (c) 2017 Yusuf Olokoba +*/ + +namespace PedometerU.Platforms { + + using UnityEngine; + using Utilities; + + public sealed class PedometerAndroid : IPedometer { + + #region --Properties-- + + public event StepCallback OnStep { + add { + PedometerHelper.Instance.OnStep += value; + } remove { + PedometerHelper.Instance.OnStep -= value; + } + } + + public bool IsSupported { + get { + #if !UNITY_ANDROID || UNITY_EDITOR + return false; + #endif + #pragma warning disable 0162 + // Get a reference to PedometerActivity + using (var player = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) pedometer = player.GetStatic("currentActivity"); + // Check if supported + return pedometer.Call("isSupported"); + #pragma warning restore 0162 + } + } + #endregion + + + #region --Op vars-- + private AndroidJavaObject pedometer; + #endregion + + + #region --Client API-- + + public IPedometer Initialize () { + // Initialize pedometer natively + pedometer.Call("initialize"); + return this; + } + + public void Release () { + // Release pedometer natively + pedometer.Call("release"); + } + #endregion + } +} \ No newline at end of file diff --git a/MoCha/Assets/Pedometer/Plugins/Managed/Platforms/PedometerAndroid.cs.meta b/MoCha/Assets/Pedometer/Plugins/Managed/Platforms/PedometerAndroid.cs.meta new file mode 100644 index 0000000..3fef5bb --- /dev/null +++ b/MoCha/Assets/Pedometer/Plugins/Managed/Platforms/PedometerAndroid.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: a4ea9668c61c34ca1bdb687aa038db95 +timeCreated: 1497547449 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/MoCha/Assets/Pedometer/Plugins/Managed/Platforms/PedometerGPS.cs b/MoCha/Assets/Pedometer/Plugins/Managed/Platforms/PedometerGPS.cs new file mode 100644 index 0000000..d0aba76 --- /dev/null +++ b/MoCha/Assets/Pedometer/Plugins/Managed/Platforms/PedometerGPS.cs @@ -0,0 +1,103 @@ +/* +* Pedometer +* Copyright (c) 2017 Yusuf Olokoba +*/ + +namespace PedometerU.Platforms { + + using UnityEngine; + using System; + using System.Collections; + using Utilities; + + public sealed class PedometerGPS : IPedometer { + + #region --Properties-- + public event StepCallback OnStep; + public bool IsSupported {get {return true;}} + public bool Running {get; private set;} + private const double + LocationTimeout = 20f, + EarthRadius = 6378.137d, // Meters + DegreesToRadians = Math.PI / 180d, + StepsToMeters = 0.715f; + #endregion + + + #region --Client API-- + + public IPedometer Initialize () { + // Check that the user has granted permissions + if (!Input.location.isEnabledByUser) Debug.LogError("Pedometer Error: GPS backend requires GPS permissions"); + // Initialize location services + else PedometerHelper.Instance.Dispatch(Update()); + // Log + Debug.Log("Pedometer: Initialized GPS backend"); + return this; + } + + public void Release () { + // Stop running + Running = false; + // Log + Debug.Log("Pedometer: Released GPS backend"); + } + #endregion + + + #region --Operations-- + + private IEnumerator Update () { + // Start location service + Input.location.Start(0.5f, 3f); + // Wait until service initializes + var time = Time.realtimeSinceStartup; + yield return new WaitWhile(() => Input.location.status == LocationServiceStatus.Initializing && Time.realtimeSinceStartup - time < LocationTimeout); + // Check that service initialized + if (Input.location.status != LocationServiceStatus.Running) { + Debug.LogError("Pedometer Error: Failed to initialize location service with status: "+Input.location.status); + yield break; + } + // Get current location + var lastData = Input.location.lastData; + var distance = 0.0d; + Running = true; + // Update location + while (Running) { + // State checking + if (Input.location.status != LocationServiceStatus.Running) yield break; + // Check that the data was updated + if (Math.Abs(Input.location.lastData.timestamp - lastData.timestamp) < 1e-10) goto end; + // Accumulate haversine distance + var currentData = Input.location.lastData; + distance += Distance(lastData.latitude, lastData.longitude, currentData.latitude, currentData.longitude); + // Invoke event + if (OnStep != null) OnStep((int)(distance / StepsToMeters), distance); + // Update data + lastData = currentData; + // Next frame + end: yield return null; + } + // Stop location service + Input.location.Stop(); + } + + /// + /// Calculate the haversine distance between two latitude-longitude pairs + /// Implemented from: https://stackoverflow.com/questions/365826/calculate-distance-between-2-gps-coordinates + /// + private static double Distance (double lat1, double lon1, double lat2, double lon2) { + double + dlat = (lat2 - lat1) * DegreesToRadians, + dlong = (lon2 - lon1) * DegreesToRadians, + a = Math.Pow(Math.Sin(dlat / 2.0), 2) + + Math.Cos(lat1 * DegreesToRadians) * + Math.Cos(lat2 * DegreesToRadians) * + Math.Pow(Math.Sin(dlong / 2.0), 2), + c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1.0 - a)), + distance = EarthRadius * c; + return distance; + } + #endregion + } +} \ No newline at end of file diff --git a/MoCha/Assets/Pedometer/Plugins/Managed/Platforms/PedometerGPS.cs.meta b/MoCha/Assets/Pedometer/Plugins/Managed/Platforms/PedometerGPS.cs.meta new file mode 100644 index 0000000..d1c862b --- /dev/null +++ b/MoCha/Assets/Pedometer/Plugins/Managed/Platforms/PedometerGPS.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 35cee1988de7f4d63b77211cc91fb2c4 +timeCreated: 1497635191 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/MoCha/Assets/Pedometer/Plugins/Managed/Platforms/PedometeriOS.cs b/MoCha/Assets/Pedometer/Plugins/Managed/Platforms/PedometeriOS.cs new file mode 100644 index 0000000..eb9b7bf --- /dev/null +++ b/MoCha/Assets/Pedometer/Plugins/Managed/Platforms/PedometeriOS.cs @@ -0,0 +1,68 @@ +/* +* Pedometer +* Copyright (c) 2017 Yusuf Olokoba +*/ + +namespace PedometerU.Platforms { + + using System.Runtime.InteropServices; + using Utilities; + + public sealed class PedometeriOS : IPedometer { + + #region --Properties-- + + public event StepCallback OnStep { + add { + PedometerHelper.Instance.OnStep += value; + } remove { + PedometerHelper.Instance.OnStep -= value; + } + } + + public bool IsSupported { + get { + #if !UNITY_IOS || UNITY_EDITOR + return false; + #endif + #pragma warning disable 0162 + return PDIsSupported(); + #pragma warning restore 0162 + } + } + #endregion + + + #region --Client API-- + + public IPedometer Initialize () { + // Initialize pedometer natively + PDInitialize(); + return this; + } + + public void Release () { + // Release pedometer natively + PDRelease(); + } + #endregion + + + #region --Bridge-- + + #if UNITY_IOS + [DllImport("__Internal")] + private static extern void PDInitialize (); + [DllImport("__Internal")] + private static extern void PDRelease (); + [DllImport("__Internal")] + private static extern bool PDIsSupported (); + + #else // Keep IL2CPP happy + private static void PDInitialize () {} + private static void PDRelease () {} + private static bool PDIsSupported () {return false;} + #endif + #endregion + } +} \ No newline at end of file diff --git a/MoCha/Assets/Pedometer/Plugins/Managed/Platforms/PedometeriOS.cs.meta b/MoCha/Assets/Pedometer/Plugins/Managed/Platforms/PedometeriOS.cs.meta new file mode 100644 index 0000000..21952db --- /dev/null +++ b/MoCha/Assets/Pedometer/Plugins/Managed/Platforms/PedometeriOS.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 70a78ba5eb6f443e6acf356ebd08f735 +timeCreated: 1497547449 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/MoCha/Assets/Pedometer/Plugins/Managed/Utilities.meta b/MoCha/Assets/Pedometer/Plugins/Managed/Utilities.meta new file mode 100644 index 0000000..497a0b8 --- /dev/null +++ b/MoCha/Assets/Pedometer/Plugins/Managed/Utilities.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: ee053aa1ec5124ef392cdea2fdae0609 +folderAsset: yes +timeCreated: 1497549080 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/MoCha/Assets/Pedometer/Plugins/Managed/Utilities/PedometerHelper.cs b/MoCha/Assets/Pedometer/Plugins/Managed/Utilities/PedometerHelper.cs new file mode 100644 index 0000000..d3dfb12 --- /dev/null +++ b/MoCha/Assets/Pedometer/Plugins/Managed/Utilities/PedometerHelper.cs @@ -0,0 +1,60 @@ +/* +* Pedometer +* Copyright (c) 2017 Yusuf Olokoba +*/ + +namespace PedometerU.Utilities { + + using UnityEngine; + using System.Collections; + + /// + /// Helper class used for dispatching coroutines and receiving native events raised by UnitySendMessage + /// + public class PedometerHelper : MonoBehaviour { + + + #region --Properties-- + public event StepCallback OnStep; + public static readonly PedometerHelper Instance; + #endregion + + + #region --Client API-- + + /// + /// Dispatch a coroutine to be invoked + /// + /// The queued coroutine + public Coroutine Dispatch (IEnumerator routine) { + return StartCoroutine(routine); + } + + /// + /// Event used by native implementations to report pedometer events + /// + private void OnEvent (string data) { + // Schema: "steps:distance" + int steps; double distance; string[] tokens = data.Split(':'); + // Parse + if (OnStep == null || !int.TryParse(tokens[0], out steps) || !double.TryParse(tokens[1], out distance)) return; + // Raise event + OnStep(steps, distance); + } + #endregion + + + #region --Initialization-- + + static PedometerHelper () { + // Create the singleton + Instance = new GameObject("Pedometer").AddComponent(); + } + + private void Awake () { + // Preserve across scenes + DontDestroyOnLoad(this); + } + #endregion + } +} \ No newline at end of file diff --git a/MoCha/Assets/Pedometer/Plugins/Managed/Utilities/PedometerHelper.cs.meta b/MoCha/Assets/Pedometer/Plugins/Managed/Utilities/PedometerHelper.cs.meta new file mode 100644 index 0000000..5a5e677 --- /dev/null +++ b/MoCha/Assets/Pedometer/Plugins/Managed/Utilities/PedometerHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9304dcc86ca774a288d7b682a7e9c429 +timeCreated: 1497549080 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/MoCha/Assets/Pedometer/Plugins/iOS.meta b/MoCha/Assets/Pedometer/Plugins/iOS.meta new file mode 100644 index 0000000..6538350 --- /dev/null +++ b/MoCha/Assets/Pedometer/Plugins/iOS.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6eb84ce3919f84b27ba30affccff2479 +folderAsset: yes +timeCreated: 1497486100 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/MoCha/Assets/Pedometer/Plugins/iOS/Pedometer.mm b/MoCha/Assets/Pedometer/Plugins/iOS/Pedometer.mm new file mode 100644 index 0000000..dc6e852 --- /dev/null +++ b/MoCha/Assets/Pedometer/Plugins/iOS/Pedometer.mm @@ -0,0 +1,42 @@ +// +// Pedometer.mm +// Pedometer +// +// Created by Yusuf on 06/15/17. +// Copyright (c) 2017 Yusuf Olokoba +// + +#import + +#define BRIDGE extern "C" +#define STEP2METERS 0.715 + +static CMPedometer* pedometer; + +BRIDGE void PDInitialize () { + // Create an instance + pedometer = [CMPedometer new]; + // Start updates + [pedometer startPedometerUpdatesFromDate:[NSDate date] withHandler:^(CMPedometerData* data, NSError* error) { + // Extract data + int steps = data.numberOfSteps.intValue; + double distance = CMPedometer.isDistanceAvailable ? data.distance.doubleValue : steps * STEP2METERS; + // Send to Unity + UnitySendMessage("Pedometer", "OnEvent", [[NSString stringWithFormat:@"%i:%f", steps, distance] UTF8String]); + }]; + // Log + NSLog(@"%s", "Pedometer: Initialized iOS backend"); +} + +BRIDGE void PDRelease () { + // Release and dereference + if (pedometer) [pedometer stopPedometerUpdates]; + pedometer = nil; + // Log + NSLog(@"%s", "Pedometer: Released iOS backend"); +} + +BRIDGE bool PDIsSupported () { + // Check if step counting is available + return CMPedometer.isStepCountingAvailable; +} diff --git a/MoCha/Assets/Pedometer/Plugins/iOS/Pedometer.mm.meta b/MoCha/Assets/Pedometer/Plugins/iOS/Pedometer.mm.meta new file mode 100644 index 0000000..76b9100 --- /dev/null +++ b/MoCha/Assets/Pedometer/Plugins/iOS/Pedometer.mm.meta @@ -0,0 +1,39 @@ +fileFormatVersion: 2 +guid: 0c8960212d3114db98deabda72834807 +timeCreated: 1497547087 +licenseType: Pro +PluginImporter: + serializedVersion: 2 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + data: + first: + Any: + second: + enabled: 0 + settings: {} + data: + first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + data: + first: + iPhone: iOS + second: + enabled: 1 + settings: {} + data: + first: + tvOS: tvOS + second: + enabled: 1 + settings: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/MoCha/Assets/Pedometer/README.md b/MoCha/Assets/Pedometer/README.md new file mode 100644 index 0000000..2cfbcfd --- /dev/null +++ b/MoCha/Assets/Pedometer/README.md @@ -0,0 +1,42 @@ +# Pedometer API +Pedometer is a native pedometer API for the Unity game engine. The API provides sensor information about step count and distance covered (in meters). It is a minimalist API with native backends on iOS and Android. There is also a backend that uses GPS in the case that a hardware pedometer is not available for use. Download the unitypackage [here](). + +## Pedometer +To use the API, simply create a `Pedometer` instance: +```csharp +// Create a pedometer +// The OnStep callback will be invoked each time a step is detected +var pedometer = new Pedometer(OnStep); + +void OnStep (int steps, double distance) { + // Display the values + stepText.text = steps.ToString(); + // Display distance in feet + distanceText.text = (distance * 3.28084).ToString("F2") + " ft"; +} +``` + +When you are done detecting steps from a `Pedometer` instance, you must dispose it: +```csharp +// Dispose of this pedometer instance +pedometer.Dispose(); +``` + +Because the API uses native resources, you may wish to release these resources (like stopping the step sensor to save power). To do so, use the `Release` function: +```csharp +// Release Pedometer's native resources +Pedometer.Release(); +``` + +## Architecture +The Pedometer API is modeled after the NatCam API, comprising of a unified front end and several platform-specific backend implementations. Each backend implementation must implement the `IPedometer` interface. These backend implementations are responsible for managing native resources and sensor events. On Android, Pedometer uses `SensorManager` whereas on iOS, Pedometer uses `CMPedometer`. + +## Modifications +To make modifications, simply edit the sources in Pedometer>Plugins. The `Android` directory contains the Android source, a Makefile, and an AndroidManifest.xml (which must not be renamed or moved). To build your Android changes, modify the Makefile with paths specific to your installations then run `make` in the `Android` directory. The java source will be compiled into a .jar which will be included in the application binary. + +On iOS, simply make changes you want. No need to build anything; the Unity build process will copy the Objective-C++ sources to the XCode project. + +Please contribute your changes back to the repository! Since Pedometer is open source, its development must be driven by the community. + +## Credits +- [Yusuf Olokoba](mailto:olokobayusuf@gmail.com) \ No newline at end of file diff --git a/MoCha/Assets/Pedometer/README.md.meta b/MoCha/Assets/Pedometer/README.md.meta new file mode 100644 index 0000000..1fdffab --- /dev/null +++ b/MoCha/Assets/Pedometer/README.md.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ce546a2d42ba34e34a05f4ef8c708d74 +timeCreated: 1497488311 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/MoCha/Assets/Scenes/Main.unity b/MoCha/Assets/Scenes/Main.unity index cda3c80..1ab26f5 100644 Binary files a/MoCha/Assets/Scenes/Main.unity and b/MoCha/Assets/Scenes/Main.unity differ diff --git a/MoCha/Assets/Scenes/StepCounter.unity b/MoCha/Assets/Scenes/StepCounter.unity new file mode 100644 index 0000000..a5befc3 Binary files /dev/null and b/MoCha/Assets/Scenes/StepCounter.unity differ diff --git a/MoCha/Assets/Scenes/StepCounter.unity.meta b/MoCha/Assets/Scenes/StepCounter.unity.meta new file mode 100644 index 0000000..535bf2c --- /dev/null +++ b/MoCha/Assets/Scenes/StepCounter.unity.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e5fcab55ab6a24d8eb5dd6198b597019 +timeCreated: 1497532216 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/MoCha/Assets/Scripts/SceneLoader.cs b/MoCha/Assets/Scripts/SceneLoader.cs new file mode 100644 index 0000000..abb59ae --- /dev/null +++ b/MoCha/Assets/Scripts/SceneLoader.cs @@ -0,0 +1,11 @@ +using UnityEngine; +using UnityEngine.SceneManagement; +using System.Collections; + +public class SceneLoader : MonoBehaviour { + + public void LoadScene(int scene) + { + SceneManager.LoadScene(scene); + } +} \ No newline at end of file diff --git a/MoCha/Assets/Scripts/SceneLoader.cs.meta b/MoCha/Assets/Scripts/SceneLoader.cs.meta new file mode 100644 index 0000000..d674490 --- /dev/null +++ b/MoCha/Assets/Scripts/SceneLoader.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 39ce724310132854a9cfdd3e31737ae7 +timeCreated: 1523377353 +licenseType: Free +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/MoCha/Assets/Scripts/SpinningCube.cs b/MoCha/Assets/Scripts/SpinningCube.cs index a25a28c..57c8847 100644 --- a/MoCha/Assets/Scripts/SpinningCube.cs +++ b/MoCha/Assets/Scripts/SpinningCube.cs @@ -1,8 +1,7 @@ using UnityEngine; using System.Collections; -public class SpinningCube : MonoBehaviour -{ +public class SpinningCube : MonoBehaviour { public float m_Speed = 20f; private Vector3 m_RotationDirection = Vector3.up; diff --git a/MoCha/Assets/Scripts/StepCounter.cs b/MoCha/Assets/Scripts/StepCounter.cs new file mode 100644 index 0000000..f4d34b1 --- /dev/null +++ b/MoCha/Assets/Scripts/StepCounter.cs @@ -0,0 +1,35 @@ +/* +* Pedometer +* Copyright (c) 2017 Yusuf Olokoba +*/ + +namespace PedometerU.Tests { + + using UnityEngine; + using UnityEngine.UI; + + public class StepCounter : MonoBehaviour { + + public Text stepText, distanceText; + private Pedometer pedometer; + + private void Start () { + // Create a new pedometer + pedometer = new Pedometer(OnStep); + // Reset UI + OnStep(0, 0); + } + + private void OnStep (int steps, double distance) { + // Display the values // Distance in feet + stepText.text = steps.ToString(); + distanceText.text = (distance * 3.28084).ToString("F2") + " ft"; + } + + private void OnDisable () { + // Release the pedometer + pedometer.Dispose(); + pedometer = null; + } + } +} \ No newline at end of file diff --git a/MoCha/Assets/Scripts/StepCounter.cs.meta b/MoCha/Assets/Scripts/StepCounter.cs.meta new file mode 100644 index 0000000..7d79284 --- /dev/null +++ b/MoCha/Assets/Scripts/StepCounter.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 21f5752f378f34804a2850c37523d8ba +timeCreated: 1497533908 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/MoCha/ProjectSettings/EditorBuildSettings.asset b/MoCha/ProjectSettings/EditorBuildSettings.asset index 22e6c50..a08be6f 100644 Binary files a/MoCha/ProjectSettings/EditorBuildSettings.asset and b/MoCha/ProjectSettings/EditorBuildSettings.asset differ diff --git a/MoCha/ProjectSettings/UnityAdsSettings.asset b/MoCha/ProjectSettings/UnityAdsSettings.asset deleted file mode 100644 index 0db06d2..0000000 Binary files a/MoCha/ProjectSettings/UnityAdsSettings.asset and /dev/null differ