Ejemplo n.º 1
0
        private void OnPointSelected(PoiViewItem item)
        {
            if (item == null)
            {
                ShowControls();
                _poiInfo.Visibility = ViewStates.Gone;
            }
            else
            {
                HideControls();
                _poiInfo.Visibility = ViewStates.Visible;

                var altitudeText      = $"{Resources.GetText(Resource.String.Common_Altitude)}: {item.Poi.Altitude} m";
                var distanceText      = $"{Resources.GetText(Resource.String.Common_Distance)}: {(item.GpsLocation.Distance / 1000):F2} km";
                var verticalAngleText = $"{Resources.GetText(Resource.String.Common_VerticalViewAngle)}: {(item.VerticalViewAngle > 0 ? "+" : "")}{item.VerticalViewAngle:F3}°";
                var bearingText       = $"{Resources.GetText(Resource.String.Common_Bearing)}: {(item.GpsLocation.Bearing > 0 ? "+" : "")}{item.GpsLocation.Bearing:F0}°";

                FindViewById <TextView>(Resource.Id.textViewPoiName).Text = item.Poi.Name;
                FindViewById <ImageView>(Resource.Id.imageViewInfoAvailable).Visibility     = item.IsImportant() ? ViewStates.Visible : ViewStates.Gone;
                FindViewById <TextView>(Resource.Id.textViewPoiPartiallyVisible).Visibility = item.IsFullyVisible() ? ViewStates.Invisible : ViewStates.Visible;
                FindViewById <TextView>(Resource.Id.textViewPoiDescription).Text            = bearingText + " / " + verticalAngleText;
                FindViewById <TextView>(Resource.Id.textViewPoiGpsLocation).Text            = altitudeText + " / " + distanceText;
                FindViewById <TextView>(Resource.Id.textViewPoiData).Text = $"{Resources.GetText(Resource.String.Common_GPSLocation)}: {item.GpsLocation.LocationAsString()}";
                FindViewById <Button>(Resource.Id.buttonWiki).Visibility  = WikiUtilities.HasWiki(item.Poi) ? ViewStates.Visible : ViewStates.Gone;
                FindViewById <Button>(Resource.Id.buttonWiki).Text        = Resources.GetText(Resource.String.Common_Details);
                FindViewById <Button>(Resource.Id.buttonMap).Text         = Resources.GetText(Resource.String.Common_Map);

                var favouriteResId = item.Poi.Favorite ? Android.Resource.Drawable.ButtonStarBigOn : Android.Resource.Drawable.ButtonStarBigOff;
                FindViewById <ImageView>(Resource.Id.buttonFavourite).SetImageResource(favouriteResId);
            }
        }
Ejemplo n.º 2
0
        public static Visibility IsPoiVisible(PoiViewItem item, ElevationProfileData elevationProfileData)
        {
            if (elevationProfileData == null)
            {
                return(Visibility.Visible);
            }

            var leftPoints  = elevationProfileData.GetData((int)item.GpsLocation.Bearing);
            var rightPoints = elevationProfileData.GetData((int)GpsUtils.Normalize360(item.GpsLocation.Bearing.Value + 1));

            if (leftPoints == null || rightPoints == null)
            {
                return(Visibility.Visible);
            }

            var maxLeft = new GpsLocation()
            {
                VerticalViewAngle = -100, Distance = 100
            };
            var leftPoints2 = leftPoints.GetPoints().Where(p => p.Distance < item.GpsLocation.Distance);

            if (leftPoints2.Any())
            {
                maxLeft = leftPoints2.Aggregate((max, item2) => item2?.VerticalViewAngle > max?.VerticalViewAngle ? item2 : max);
            }

            var maxRight = new GpsLocation()
            {
                VerticalViewAngle = -100, Distance = 100
            };
            var rightPoints2 = rightPoints.GetPoints().Where(p => p.Distance < item.GpsLocation.Distance);

            if (rightPoints2.Any())
            {
                maxRight = rightPoints2.Aggregate((max, item2) => item2?.VerticalViewAngle > max?.VerticalViewAngle ? item2 : max);
            }

            var maxViewAngle = maxRight.VerticalViewAngle > maxLeft.VerticalViewAngle ? maxRight : maxLeft;

            var itemViewAngle     = item.VerticalViewAngle;
            var viewAngleDiff     = item.VerticalViewAngle - maxViewAngle.VerticalViewAngle;
            var viewAngleDistance = item.GpsLocation.Distance - maxViewAngle.Distance;

            var viewAngleVisibilityLimit     = -(itemViewAngle * 0.01 + 0.0);
            var viewAnglePartVisibilityLimit = -(itemViewAngle * 0.2 + 1.0);
            var distancePartVisibilityLimit  = 2000;//m

            if (viewAngleDiff > viewAngleVisibilityLimit)
            {
                return(Visibility.Visible);
            }

            if (viewAngleDiff > viewAnglePartVisibilityLimit && viewAngleDistance < distancePartVisibilityLimit)
            {
                return(Visibility.PartialyVisible);
            }

            return(Visibility.Invisible);
        }
Ejemplo n.º 3
0
 public void DrawItemIcon(Android.Graphics.Canvas canvas, PoiViewItem item, float heading, float offsetX, float offsetY, double leftTiltCorrector, double rightTiltCorrector, double canvasWidth)
 {
     var(x, y) = GetXY(item, heading, offsetX, offsetY, leftTiltCorrector, rightTiltCorrector, canvas.Width, canvas.Height);
     if (x != null && y != null)
     {
         OnDrawItemIcon(canvas, item, x.Value, y.Value);
     }
 }
Ejemplo n.º 4
0
        public void OnPoiEdit(int position)
        {
            PoiViewItem item = _adapter[position];
            Intent      editActivityIntent = new Intent(this, typeof(EditActivity));

            editActivityIntent.PutExtra("Id", item.Poi.Id);
            StartActivityForResult(editActivityIntent, EditActivity.REQUEST_EDIT_POI);
        }
Ejemplo n.º 5
0
        public void OnPoiLike(int position)
        {
            PoiViewItem item = _adapter[position];

            item.Poi.Favorite = !item.Poi.Favorite;
            _adapter.NotifyDataSetChanged();
            Context.Database.UpdateItemAsync(item.Poi);
        }
Ejemplo n.º 6
0
        protected Paint GetTextPaint(PoiViewItem item)
        {
            if (item.Selected)
            {
                return(textpaintSelected);
            }

            return(textpaint);
        }
Ejemplo n.º 7
0
        protected Paint GetRectPaint(PoiViewItem item)
        {
            if (item.Selected)
            {
                return(paintRectSelectedItem);
            }

            return(paintRect);
        }
Ejemplo n.º 8
0
        public static ColorMatrixColorFilter GetColorFilter(PoiViewItem item)
        {
            if (item.Poi.Favorite)
            {
                return(GetFavouriteColorFilter());
            }

            return(item.IsImportant() ? GetImportantColorFilter() : GetCommonColorFilter());
        }
Ejemplo n.º 9
0
        private void AddMyLocation(PoiViewItemList poiViewItems)
        {
            var myLocation = new PoiViewItem(GetMyLocationPoi(AppContext));

            myLocation.GpsLocation.Distance          = 0;
            myLocation.GpsLocation.Bearing           = 0;
            myLocation.GpsLocation.VerticalViewAngle = 0;

            poiViewItems.Insert(0, myLocation);
        }
Ejemplo n.º 10
0
        public override void OnDrawItemIcon(Android.Graphics.Canvas canvas, PoiViewItem item, float startX, float endY)
        {
            int circleSize = 42;

            canvas.DrawCircle(startX, ToPixels(circleSize), ToPixels(circleSize), paintBlack);
            canvas.DrawCircle(startX, ToPixels(circleSize), ToPixels(circleSize - 3), item.Selected ? paintWhite : paintGray);

            var bmp = poiCategoryBitmapProvider.GetCategoryIcon(item.Poi.Category);

            canvas.DrawBitmap(bmp, startX - ToPixels(33), ToPixels(circleSize - 33), null /*ColorFilterPoiItem.GetPaintFilter(item)*/);
        }
Ejemplo n.º 11
0
        public float GetClickDistance(PoiViewItem item, float heading, float offsetX, float offsetY, double leftTiltCorrector, double rightTiltCorrector, float canvasWidth, float canvasHeight, float clickX, float clickY)
        {
            var(itemX, itemY) = GetXY(item, heading, offsetX, offsetY, leftTiltCorrector, rightTiltCorrector, canvasWidth, canvasHeight);
            if (itemX.HasValue && itemY.HasValue)
            {
                float xDiff = itemX.Value - clickX;
                float yDiff = itemY.Value - clickY;
                return(FloatMath.Sqrt(xDiff * xDiff + yDiff * yDiff));
            }

            return(float.MaxValue);
        }
Ejemplo n.º 12
0
        /// <summary>
        /// Filter items
        /// </summary>
        /// <param name="item"></param>
        /// <param name="minDiff"></param>
        /// <returns>returns true if items are overlapping</returns>
        public bool IsOverlapping(PoiViewItem item, double minDiff)
        {
            foreach (var heading in _headings)
            {
                if (IsOverlapping(heading.GpsLocation.Bearing.Value, item.GpsLocation.Bearing.Value, minDiff))
                {
                    return(true);
                }
            }

            _headings.Add(item);
            return(false);
        }
Ejemplo n.º 13
0
        public bool IsItemClicked(PoiViewItem item, float heading, float offsetX, float offsetY, double leftTiltCorrector, double rightTiltCorrector, float canvasWidth, float canvasHeight, float clickX, float clickY)
        {
            var(itemX, itemY) = GetXY(item, heading, offsetX, offsetY, leftTiltCorrector, rightTiltCorrector, canvasWidth, canvasHeight);
            if (itemX.HasValue && itemY.HasValue)
            {
                float xDiff = itemX.Value - clickX;
                if (Math.Abs(xDiff) < GetItemWidth() && clickY < itemY)
                {
                    return(true);
                }
            }

            return(false);
        }
Ejemplo n.º 14
0
        public void OnPoiDelete(int position)
        {
            AlertDialog.Builder alert = new AlertDialog.Builder(this).SetCancelable(false);
            alert.SetPositiveButton(Resources.GetText(Resource.String.Common_Yes), (senderAlert, args) =>
            {
                PoiViewItem item = _adapter[position];
                Context.Database.DeleteItemAsync(item.Poi);
                _adapter.RemoveAt(position);
            });
            alert.SetNegativeButton(Resources.GetText(Resource.String.Common_No), (senderAlert, args) => { });
            alert.SetMessage(Resources.GetText(Resource.String.PoiListDeleteQuestion));
            var answer = alert.Show();


            _adapter.NotifyDataSetChanged();
        }
Ejemplo n.º 15
0
        public (float?x, float?y) GetXY(PoiViewItem item, float heading, float offsetX, float offsetY, double leftTiltCorrector, double rightTiltCorrector, float canvasWidth, float canvasHeight)
        {
            var startX = CompassViewUtils.GetXLocationOnScreen(heading, (float)item.GpsLocation.Bearing, canvasWidth, adjustedViewAngleHorizontal, offsetX);

            if (!startX.HasValue)
            {
                return(null, null);
            }

            double verticalAngleCorrection = CompassViewUtils.GetTiltCorrection(item.GpsLocation.Bearing.Value, heading, viewAngleHorizontal, leftTiltCorrector, rightTiltCorrector);
            double verticalAngle           = item.VerticalViewAngle;

            float endY = CompassViewUtils.GetYLocationOnScreen(verticalAngle + verticalAngleCorrection, canvasHeight, adjustedViewAngleVertical) + offsetY;

            return(startX, endY);
        }
Ejemplo n.º 16
0
        public PoiViewItem GetPoiByScreenLocation(float x, float y, bool displayOverlapped)
        {
            if (ShowPointsOfInterest && _poisToBeDisplayed != null)
            {
                (x, y) = ToLocationOnScreen(x, y);

                var heading = (_context.HeadingX ?? 0) + _context.HeadingCorrector;

                if (displayOverlapped)
                {
                    PoiViewItem selectedItem         = null;
                    float       selectedItemDistance = float.MaxValue;
                    foreach (var item in _poisToBeDisplayed)
                    {
                        if (item.Visibility != Peaks360Lib.Domain.Enums.Visibility.Invisible)
                        {
                            var dist = compassViewDrawer.GetClickDistance(item, (float)heading, (float)_offsetX, (float)_offsetY, _context.LeftTiltCorrector, _context.RightTiltCorrector, Width, Height, x, y);
                            if (dist < selectedItemDistance)
                            {
                                selectedItemDistance = dist;
                                selectedItem         = item;
                            }
                        }
                    }

                    return(selectedItemDistance < 30 ? selectedItem : null);
                }
                else
                {
                    foreach (var item in _poisToBeDisplayed)
                    {
                        if (item.Visibility != Peaks360Lib.Domain.Enums.Visibility.Invisible && !item.Overlapped)
                        {
                            if (compassViewDrawer.IsItemClicked(item, (float)heading, (float)_offsetX, (float)_offsetY, _context.LeftTiltCorrector, _context.RightTiltCorrector, Width, Height, x, y))
                            {
                                return(item);
                            }
                        }
                    }
                }
            }

            return(null);
        }
Ejemplo n.º 17
0
        public static Paint GetPaintFilter(PoiViewItem item)
        {
            if (_pPoiCommon == null || _pPoiImportant == null)
            {
                _pPoiCommon = new Paint();
                _pPoiCommon.SetColorFilter(GetCommonColorFilter());

                _pPoiImportant = new Paint();
                _pPoiImportant.SetColorFilter(GetImportantColorFilter());

                _pPoiFavourite = new Paint();
                _pPoiFavourite.SetColorFilter(GetFavouriteColorFilter());
            }

            if (item.Poi.Favorite)
            {
                return(_pPoiFavourite);
            }
            return(item.IsImportant() ? _pPoiImportant : _pPoiCommon);
        }
Ejemplo n.º 18
0
        protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
        {
            base.OnActivityResult(requestCode, resultCode, data);
            if (requestCode == EditActivity.REQUEST_ADD_POI)
            {
                if (resultCode == EditActivity.RESULT_OK)
                {
                    var id   = data.GetLongExtra("Id", 0);
                    var item = Context.Database.GetItem(id);

                    var poiViewItem = new PoiViewItem(item);
                    poiViewItem.GpsLocation.Bearing  = _iGpsUtilities.Bearing(Context.MyLocation, poiViewItem.GpsLocation);
                    poiViewItem.AltitudeDifference   = CompassViewUtils.GetAltitudeDifference(Context.MyLocation, poiViewItem.GpsLocation);
                    poiViewItem.GpsLocation.Distance = _iGpsUtilities.Distance(Context.MyLocation, poiViewItem.GpsLocation);
                    _adapter.Add(poiViewItem);
                }
                if (resultCode == EditActivity.RESULT_OK_AND_CLOSE_PARENT)
                {
                    SetResult(RESULT_OK_AND_CLOSE_PARENT);
                    Finish();
                }
            }

            if (requestCode == EditActivity.REQUEST_EDIT_POI)
            {
                if (resultCode == EditActivity.RESULT_OK)
                {
                    var id              = data.GetLongExtra("Id", 0);
                    var itemfromDb      = Context.Database.GetItem(id);
                    var itemfromAdapter = _adapter.GetPoiItem(id);
                    itemfromAdapter.Poi = itemfromDb;

                    _adapter.NotifyDataSetChanged();
                }
                if (resultCode == EditActivity.RESULT_OK_AND_CLOSE_PARENT)
                {
                    SetResult(RESULT_OK_AND_CLOSE_PARENT);
                    Finish();
                }
            }
        }
Ejemplo n.º 19
0
        private IOrderedEnumerable <PoiViewItem> FilterPoisDoBeDisplayed(List <PoiViewItem> srcList)
        {
            if (srcList == null)
            {
                return(null);
            }

            PoiViewItem[] listCopy = new PoiViewItem[srcList.Count];
            srcList.CopyTo(listCopy);
            foreach (var item in listCopy)
            {
                item.Visibility = CompassViewUtils.IsPoiVisible(item, _context.ElevationProfileData);
            }

            _poisToBeDisplayed = listCopy.Where(poi =>
                                                poi.Visibility != Peaks360Lib.Domain.Enums.Visibility.Invisible &&
                                                (!_context.ShowFavoritesOnly || poi.Poi.Favorite))
                                 .OrderByDescending(poi => poi.Priority)
                                 .ThenByDescending(poi => poi.GpsLocation.VerticalViewAngle);

            CheckOverlappingItems(_poisToBeDisplayed);
            return(_poisToBeDisplayed);
        }
Ejemplo n.º 20
0
 public virtual void OnDrawItemIcon(Android.Graphics.Canvas canvas, PoiViewItem item, float startX, float endY)
 {
 }
Ejemplo n.º 21
0
 /// <summary>
 /// Draws item into given canvas
 /// </summary>
 /// <param name="canvas"></param>
 /// <param name="item"></param>
 /// <param name="heading"></param>
 public virtual void OnDrawItem(Android.Graphics.Canvas canvas, PoiViewItem item, float startX, float endY, bool displayOverlapped)
 {
 }
Ejemplo n.º 22
0
        public override void OnDrawItem(Canvas canvas, PoiViewItem item, float startX, float endY, bool displayOverlapped)
        {
            //   x1   x2
            //    /--\  yIconStart
            //   |ICON| yIconMiddle
            //   |\__/| yIconEnd
            //   | T  | yTextAreaEnd
            //   | e  |
            //   | x  | yTipBend
            //   \ t /  yTextAreaEnd
            //    \ /
            //     V    yTipEnd

            //float yIconStart = 0;
            float yIconEnd       = ToPixels(70);
            float yIconMiddle    = yIconEnd / 2 + 1;
            float yTextAreaStart = ToPixels(90);
            float yTextAreaEnd   = endY - ToPixels(25);
            float yTipBend       = endY - ToPixels(50);
            float yTipEnd        = endY;

            if (!item.Overlapped)
            {
                float x1 = startX - ToPixels(35);
                float x2 = startX + ToPixels(35);

                var path = new Path();
                path.MoveTo(yIconMiddle, -x1);
                path.LineTo(yTipBend, -x1);
                path.LineTo(yTipEnd, -startX);
                path.LineTo(yTipBend, -x2);
                path.LineTo(yIconMiddle, -x2);
                canvas.DrawPath(path, GetRectPaint(item));

                var dyTextSpace     = ToPixels(10);
                var dyImportantIcon = ToPixels(30);
                var dyFavouriteIcon = ToPixels(40);
                var dyIconSpace     = ToPixels(3);

                var textWidth = yTextAreaEnd - yTextAreaStart - dyTextSpace - (item.IsImportant() ? dyImportantIcon + dyIconSpace : 0) - (item.Poi.Favorite ? dyFavouriteIcon + dyIconSpace : 0);
                var text1     = EllipsizeText(item.Poi.Name, textWidth / multiplier);
                var text2     = EllipsizeText($"{item.Poi.Altitude} m / {(item.GpsLocation.Distance / 1000):F2} km", textWidth / multiplier);

                var textPaint = GetTextPaint(item);
                canvas.DrawText(text1, yTextAreaStart, -startX - ToPixels(4), textPaint);
                canvas.DrawText(text2, yTextAreaStart, -startX + ToPixels(29), textPaint);

                Rect bounds = new Rect();
                textPaint.GetTextBounds(text1.ToCharArray(), 0, text1.Length, bounds);

                float iconOffset = yTextAreaStart + bounds.Width() + dyTextSpace;
                if (item.IsImportant() && iconOffset + dyImportantIcon <= yTextAreaEnd)
                {
                    canvas.DrawBitmap(item.Selected ? infoBitmapBlack : infoBitmapYellow, iconOffset, -startX - ToPixels(30), null);
                    iconOffset += dyImportantIcon + dyIconSpace;
                }

                if (item.Poi.Favorite && iconOffset + dyFavouriteIcon <= yTextAreaEnd)
                {
                    canvas.DrawBitmap(favouriteBitmap, iconOffset, -startX - ToPixels(40), null);
                    iconOffset += dyFavouriteIcon + dyIconSpace;
                }
            }

            if (displayOverlapped)
            {
                if (item.Poi.Favorite)
                {
                    canvas.DrawCircle(endY, -startX, ToPixels(30), paintTapFavourite);
                    canvas.DrawCircle(endY, -startX, ToPixels(6), paintWhite);
                }
                else if (item.Selected)
                {
                    canvas.DrawCircle(endY, -startX, ToPixels(30), paintRectSelectedItem);
                    canvas.DrawCircle(endY, -startX, ToPixels(6), paintBlack);
                }
                else
                {
                    canvas.DrawCircle(endY, -startX, ToPixels(30), paintTapArea);
                    canvas.DrawCircle(endY, -startX, ToPixels(6), paintWhite);
                }
            }
        }