private void InitMotionDetectedObservable() { this.MotionDetectedObservable = Observable.Create <DetectedMotionResult>(async ob => { this._Client.Connect(GoogleApiClient.SignInModeOptional); await this.WhenStatusChanged().Any(s => s == Status.Connected); var broadcastReceiver = new EventBroadcastReceiver(); LocalBroadcastManager.GetInstance(Application.Context).RegisterReceiver(broadcastReceiver, new IntentFilter(Constants.BroadcastAction)); var sub1 = Observable.FromEventPattern <BroadcastEventArgs>(h => broadcastReceiver.Received += h, h => broadcastReceiver.Received -= h) .Subscribe(e => { var activityResult = (ActivityRecognitionResult)e.EventArgs.Intent.GetParcelableExtra(Constants.ActivitiesExtra); DetectedMotion mostProbableMotion = GetMostProbableMotion(activityResult); DetectedMotion[] motions = activityResult.ProbableActivities.Select(da => new DetectedMotion(da.Confidence, da.GetMotionType())) .ToArray(); ob.OnNext(new DetectedMotionResult(activityResult.GetDateTime(), mostProbableMotion, motions)); }); var intent = new Intent(Application.Context, typeof(DetectedActivitiesIntentService)); var pendingIntent = PendingIntent.GetService(Application.Context, 0, intent, PendingIntentFlags.UpdateCurrent); Statuses result = await ActivityRecognition.ActivityRecognitionApi.RequestActivityUpdatesAsync(this._Client, 0L, pendingIntent); // TODO: instead of 0L, use Config property, make sure the Config object is captured inside the lambda. if (!result.IsSuccess) { ob.OnError(new Exception("Request failed")); } return(() => { sub1.Dispose(); LocalBroadcastManager.GetInstance(Application.Context).UnregisterReceiver(broadcastReceiver); broadcastReceiver.Dispose(); this._Client.Disconnect(); this._Client.Dispose(); }); }) .Replay(1); this.MotionDetectedObservable.Connect(); // TODO? store this somewhere? }
private void InitMotionDetectedObservable() { this.MotionDetectedObservable = Observable.Create <DetectedMotionResult>(ob => { this.MotionActivityManager.StartActivityUpdates(NSOperationQueue.MainQueue, activity => { var dateTime = activity.StartDate.ToDateTime(); var mostProbable = new DetectedMotion(activity.Confidence.ToPercentage(), activity.GetMotionType()); var detectedMotions = CreatePossibleMotions(activity).ToArray(); ob.OnNext(new DetectedMotionResult(dateTime, mostProbable, detectedMotions)); }); return(() => { this.MotionActivityManager.StopActivityUpdates(); this.MotionActivityManager.Dispose(); }); }) .Replay(1); this.MotionDetectedObservable.Connect(); }
public DetectedMotionResult(DateTime timestamp, DetectedMotion mostProbableMotion, DetectedMotion[] detectedMotions) { this.Timestamp = timestamp; this.MostProbableMotion = mostProbableMotion; this.DetectedMotions = Array.AsReadOnly(detectedMotions); }