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