コード例 #1
0
        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?
        }
コード例 #2
0
        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();
        }
コード例 #3
0
 public DetectedMotionResult(DateTime timestamp, DetectedMotion mostProbableMotion, DetectedMotion[] detectedMotions)
 {
     this.Timestamp          = timestamp;
     this.MostProbableMotion = mostProbableMotion;
     this.DetectedMotions    = Array.AsReadOnly(detectedMotions);
 }