/// <summary> /// Requests a vibration on Android for the specified pattern, amplitude and optional repeat /// </summary> /// <param name="pattern">Pattern.</param> /// <param name="amplitudes">Amplitudes.</param> /// <param name="repeat">Repeat : -1 : no repeat, 0 : infinite, 1 : repeat once, 2 : repeat twice, etc</param> public static void AndroidVibrate(long[] pattern, int[] amplitudes, int repeat, bool threaded = false) { if (!MMNVPlatform.Android()) { return; } if ((pattern == null) || (amplitudes == null)) { return; } if ((pattern.Length == 0) || (amplitudes.Length == 0)) { return; } if ((AndroidSDKVersion() < 26)) { AndroidVibrator.Call("vibrate", pattern, repeat); } else { if (threaded) { if (_androidVibrateThread == null) { _androidVibrateThread = new MMNVAltThread <MMNVAndroidVibrateThreadData>(); _androidVibrateThreadData = new MMNVAndroidVibrateThreadData(); } _androidVibrateThreadData.Pattern = pattern; _androidVibrateThreadData.Amplitudes = amplitudes; _androidVibrateThreadData.Repeat = repeat; _androidVibrateThread.Run(AndroidVibrateThread, _androidVibrateThreadData); } else { AndroidVibrateNoThread(pattern, amplitudes, repeat); } } }
/// <summary> /// An internal method used to vibrate on a pattern/amplitude model using a secondary thread /// If you use that, you should call MMNVAndroid.ClearThreads() on exit (where exactly depends on your game, but OnDisable should cover most cases) /// </summary> /// <param name="threadData"></param> private static void AndroidVibrateThread(MMNVAndroidVibrateThreadData threadData) { AndroidJNI.AttachCurrentThread(); AndroidVibrateNoThread(threadData.Pattern, threadData.Amplitudes, threadData.Repeat); AndroidJNI.DetachCurrentThread(); }