diff --git a/main/MyFriendsAround.WP7/ApplicationIcon.png b/main/MyFriendsAround.WP7/ApplicationIcon.png index 5d874b5..88924ac 100644 Binary files a/main/MyFriendsAround.WP7/ApplicationIcon.png and b/main/MyFriendsAround.WP7/ApplicationIcon.png differ diff --git a/main/MyFriendsAround.WP7/MyFriendsAround.WP7.csproj b/main/MyFriendsAround.WP7/MyFriendsAround.WP7.csproj index d48bc3d..714e45e 100644 --- a/main/MyFriendsAround.WP7/MyFriendsAround.WP7.csproj +++ b/main/MyFriendsAround.WP7/MyFriendsAround.WP7.csproj @@ -216,12 +216,17 @@ PreserveNewest - Always + PreserveNewest - Always + PreserveNewest + + + PreserveNewest + + + PreserveNewest - PreserveNewest diff --git a/main/MyFriendsAround.WP7/ViewModel/MainViewModel.cs b/main/MyFriendsAround.WP7/ViewModel/MainViewModel.cs index 43bdbe2..0e269ec 100644 --- a/main/MyFriendsAround.WP7/ViewModel/MainViewModel.cs +++ b/main/MyFriendsAround.WP7/ViewModel/MainViewModel.cs @@ -22,6 +22,7 @@ using Hammock; using Hammock.Serialization; using Microsoft.Phone; using Microsoft.Phone.Controls; +using Microsoft.Phone.Controls.Maps; using Microsoft.Silverlight.Testing; using MyFriendsAround.Common.Entities; using MyFriendsAround.WP7.Service; @@ -47,6 +48,41 @@ namespace MyFriendsAround.WP7.ViewModel /// public class MainViewModel : ViewModelBase { + + /// + /// Initializes a new instance of the MainViewModel class. + /// + public MainViewModel() + { + // + MainLoadCommand = new RelayCommand(() => MainLoad()); + PublishLocationCommand = new RelayCommand(() => PublishLocationAction()); + DisplayAboutCommand = new RelayCommand(() => DisplayAbout()); + NavigateToSettingsCommand = new RelayCommand(() => NavigateToSettings()); + RefreshFriendsCommand = new RelayCommand(() => RefreshFriends()); + ShowAboutCommand = new RelayCommand(() => ShowAbout()); + SaveMySettingsCommand = new RelayCommand(() => SaveMySettings()); + CancelMySettingsCommand = new RelayCommand(() => CancelMySettings()); + ChoosePhotoCommand = new RelayCommand(() => ChoosePhoto()); + CropSaveCommand = new RelayCommand(() => CropSave()); + CropCancelCommand = new RelayCommand(() => CropCancel()); + MapViewChangedCommand = new RelayCommand(boundRectangle => MapViewChanged(boundRectangle)); + ShowMyLocationCommand = new RelayCommand(() => ShowMyLocation()); + + if (IsInDesignMode) + { + // Code runs in Blend --> create design time data. + } + else + { + // Code runs "for real" + } + + } + + + #region Properties + public string ApplicationTitle { get @@ -55,6 +91,10 @@ namespace MyFriendsAround.WP7.ViewModel } } + + + #region PageTitles + public string PageName { get @@ -79,33 +119,305 @@ namespace MyFriendsAround.WP7.ViewModel } } + #endregion + + + /// - /// Initializes a new instance of the MainViewModel class. + /// The property's name. /// - public MainViewModel() + public const string MyPicturePropertyName = "MyPicture"; + private ImageSource _myPicture = new BitmapImage(new Uri("/icons/anonymousIcon.png", UriKind.RelativeOrAbsolute)); + + /// + /// Gets the MyPicture property. + /// + public ImageSource MyPicture + { + get + { + return _myPicture; + } + + set + { + if (_myPicture == value) + { + return; + } + + _myPicture = value; + + // Update bindings, no broadcast + RaisePropertyChanged(MyPicturePropertyName); + } + } + + + + + + + + /// + /// The property's name. + /// + public const string MyNamePropertyName = "MyName"; + private string _myName = "Guest"; + + /// + /// Gets the MyName property. + /// + public string MyName + { + get { return _myName; } + set + { + if (_myName == value) + { + return; + } + var oldValue = _myName; + _myName = value; + // Update bindings, no broadcast + RaisePropertyChanged(MyNamePropertyName); + } + } + + + public string AppBarTextAbout + { + get { return "About"; } + } + + public string AppBarTextSettings + { + get { return "Settings"; } + } + + public string AppBarTextPublish + { + get { return "Publish"; } + } + + public string AppBarTextRefresh + { + get { return "Refresh"; } + } + + public string AppBarTextMyLocation + { + get { return "My Location"; } + } + + public string AppBarTextSaveSettings + { + get { return "Save"; } + } + + public string AppBarTextCancelSettings + { + get { return "Cancel"; } + } + + /// + /// The property's name. + /// + public const string PushPinsPropertyName = "PushPins"; + private ObservableCollection _PushPins = new ObservableCollection(); + /// + /// Gets the PushPins property. + /// + public ObservableCollection PushPins + { + get + { + return _PushPins; + } + + set + { + if (_PushPins == value) + { + return; + } + + _PushPins = value; + + // Update bindings, no broadcast + RaisePropertyChanged(PushPinsPropertyName); + } + } + + + /// + /// The property's name. + /// + public const string VisiblePushPinsPropertyName = "VisiblePushPins"; + private ObservableCollection _VisiblePushPins = new ObservableCollection(); + /// + /// Gets the PushPins property. + /// + public ObservableCollection VisiblePushPins + { + get + { + return _VisiblePushPins; + } + + set + { + if (_VisiblePushPins == value) + { + return; + } + + _VisiblePushPins = value; + + // Update bindings, no broadcast + RaisePropertyChanged(VisiblePushPinsPropertyName); + } + } + + + /// + /// The property's name. + /// + public const string MapZoomPropertyName = "MapZoom"; + + private int _mapZoom = 1; + + /// + /// Gets the MapZoom property. + /// + public int MapZoom + { + get + { + return _mapZoom; + } + + set + { + if (_mapZoom == value) + { + return; + } + _mapZoom = value; + + // Update bindings, no broadcast + RaisePropertyChanged(MapZoomPropertyName); + } + } + + + + + /// + /// The property's name. + /// + public const string IsBusyPropertyName = "IsBusy"; + + private bool _isBusy = false; + + /// + /// Gets the IsBusy property. + /// + public bool IsBusy + { + get + { + return _isBusy; + } + + set + { + if (_isBusy == value) + { + return; + } + + var oldValue = _isBusy; + _isBusy = value; + + // Update bindings, no broadcast + RaisePropertyChanged(IsBusyPropertyName); + } + } + + + + /// + /// The property's name. + /// + public const string MapCenterPropertyName = "MapCenter"; + + private GeoCoordinate _mapCenter = null; + + /// + /// Gets the MapCenter property. + /// + public GeoCoordinate MapCenter + { + get + { + return _mapCenter; + } + + set + { + if (_mapCenter == value) + { + return; + } + + var oldValue = _mapCenter; + _mapCenter = value; + + // Update bindings, no broadcast + RaisePropertyChanged(MapCenterPropertyName); + } + } + + #endregion + + #region Commands + + public ICommand MainLoadCommand { get; set; } + public ICommand PublishLocationCommand { get; set; } + public ICommand DisplayAboutCommand { get; set; } + public ICommand NavigateToSettingsCommand { get; set; } + public ICommand ShowMyLocationCommand { get; set; } + public ICommand RefreshFriendsCommand { get; set; } + public ICommand ShowAboutCommand { get; set; } + public ICommand SaveMySettingsCommand { get; set; } + public ICommand CancelMySettingsCommand { get; set; } + public ICommand ChoosePhotoCommand { get; set; } + public ICommand CropSaveCommand { get; set; } + public ICommand CropCancelCommand { get; set; } + public ICommand MapViewChangedCommand { get; set; } + + #endregion + + #region Implemented Commands & Methods + + private void ShowMyLocation() { // - MainLoadCommand = new RelayCommand(() => MainLoad()); - PublishLocationCommand = new RelayCommand(() => PublishLocationAction()); - DisplayAboutCommand = new RelayCommand(() => DisplayAbout()); - NavigateToSettingsCommand = new RelayCommand(() => NavigateToSettings()); - RefreshFriendsCommand = new RelayCommand(() => RefreshFriends()); - ShowAboutCommand = new RelayCommand(() => ShowAbout()); - SaveMySettingsCommand = new RelayCommand(() => SaveMySettings()); - CancelMySettingsCommand = new RelayCommand(() => CancelMySettings()); - ChoosePhotoCommand = new RelayCommand(() => ChoosePhoto()); - CropSaveCommand = new RelayCommand(() => CropSave()); - CropCancelCommand = new RelayCommand(() => CropCancel()); + } - if (IsInDesignMode) + private void MapViewChanged(LocationRect boundRectangle) + { + ObservableCollection _newVisiblePushPins = new ObservableCollection(); + //filter visible pushpins + foreach (PushPinModel pushPin in PushPins) { - // Code runs in Blend --> create design time data. + if (boundRectangle.Intersects(new LocationRect(pushPin.Location, .5, .5))) + { + _newVisiblePushPins.Add(pushPin); + } } - else - { - // Code runs "for real" - } - + VisiblePushPins = _newVisiblePushPins; } public void CropCancel() @@ -118,7 +430,7 @@ namespace MyFriendsAround.WP7.ViewModel { // } - + private void MainLoad() { @@ -189,7 +501,7 @@ namespace MyFriendsAround.WP7.ViewModel private void cameraTask_Completed(object sender, PhotoResult e) { - if (e.ChosenPhoto!=null && e.ChosenPhoto.Length>0) // e.TaskResult == TaskResult.OK) + if (e.ChosenPhoto != null && e.ChosenPhoto.Length > 0) // e.TaskResult == TaskResult.OK) { // Get the image temp file from e.OriginalFileName. // Get the image temp stream from e.ChosenPhoto. @@ -210,39 +522,6 @@ namespace MyFriendsAround.WP7.ViewModel } } - /// - /// The property's name. - /// - public const string MyPicturePropertyName = "MyPicture"; - private ImageSource _myPicture = new BitmapImage(new Uri("/icons/anonymousIcon.png", UriKind.RelativeOrAbsolute)); - - /// - /// Gets the MyPicture property. - /// - public ImageSource MyPicture - { - get - { - return _myPicture; - } - - set - { - if (_myPicture == value) - { - return; - } - - var oldValue = _myPicture; - _myPicture = value; - - // Update bindings, no broadcast - RaisePropertyChanged(MyPicturePropertyName); - - // Update bindings and broadcast change using GalaSoft.MvvmLight.Messenging - RaisePropertyChanged(MyPicturePropertyName, oldValue, value, true); - } - } private void CancelMySettings() @@ -289,16 +568,16 @@ namespace MyFriendsAround.WP7.ViewModel { ObservableCollection result = new ObservableCollection(); list.ForEach((f) => - { - //f.LocationStr - result.Add(new PushPinModel() - { - PinSource = "/ApplicationIcon.png", - Location = new GeoCoordinate(f.Latitude, f.Longitude), - PinUserName = f.FriendName, - PinImageUrl = string.Format("https://myfriendsaround.blob.core.windows.net/profiles/profile_{0}.jpg", f.Id) - }); - }); + { + //f.LocationStr + result.Add(new PushPinModel() + { + PinSource = "/ApplicationIcon.png", + Location = new GeoCoordinate(f.Latitude, f.Longitude), + PinUserName = f.FriendName, + PinImageUrl = string.Format("https://myfriendsaround.blob.core.windows.net/profiles/profile_{0}.jpg", f.Id) + }); + }); PushPins = result; } @@ -320,20 +599,20 @@ namespace MyFriendsAround.WP7.ViewModel { List list = args.Friends; DispatcherHelper.CheckBeginInvokeOnUI(() => - { - PopulatePushPins(list); - IsBusy = false; - } + { + PopulatePushPins(list); + IsBusy = false; + } ); } else { DispatcherHelper.CheckBeginInvokeOnUI(() => - { - IsBusy = false; - var exception = new ExceptionPrompt(); - exception.Show(args.Error); - } + { + IsBusy = false; + var exception = new ExceptionPrompt(); + exception.Show(args.Error); + } ); } } @@ -343,27 +622,27 @@ namespace MyFriendsAround.WP7.ViewModel if (args.Error != null) { DispatcherHelper.CheckBeginInvokeOnUI(() => - { - IsBusy = false; - var exception = new ExceptionPrompt(); - exception.Show(args.Error); - }); + { + IsBusy = false; + var exception = new ExceptionPrompt(); + exception.Show(args.Error); + }); } else { if (!args.IsSuccess) { DispatcherHelper.CheckBeginInvokeOnUI(() => - { - var message = new DialogMessage( - "Communication error!", DialogMessageCallback) - { - Button = MessageBoxButton.OK, - Caption = "Error!" - }; + { + var message = new DialogMessage( + "Communication error!", DialogMessageCallback) + { + Button = MessageBoxButton.OK, + Caption = "Error!" + }; - Messenger.Default.Send(message); - }); + Messenger.Default.Send(message); + }); } else { @@ -431,79 +710,6 @@ namespace MyFriendsAround.WP7.ViewModel } } - public ICommand MainLoadCommand { get; set; } - public ICommand PublishLocationCommand { get; set; } - public ICommand DisplayAboutCommand { get; set; } - public ICommand NavigateToSettingsCommand { get; set; } - public ICommand RefreshFriendsCommand { get; set; } - public ICommand ShowAboutCommand { get; set; } - public ICommand SaveMySettingsCommand { get; set; } - public ICommand CancelMySettingsCommand { get; set; } - public ICommand ChoosePhotoCommand { get; set; } - public ICommand CropSaveCommand { get; set; } - public ICommand CropCancelCommand { get; set; } - - - - - /// - /// The property's name. - /// - public const string MyNamePropertyName = "MyName"; - private string _myName = "Guest"; - - /// - /// Gets the MyName property. - /// - public string MyName - { - get { return _myName; } - set - { - if (_myName == value) - { - return; - } - var oldValue = _myName; - _myName = value; - // Update bindings, no broadcast - RaisePropertyChanged(MyNamePropertyName); - } - } - - - public string AppBarTextAbout - { - get { return "About"; } - } - - public string AppBarTextSettings - { - get { return "Settings"; } - } - - public string AppBarTextPublish - { - get { return "Publish"; } - } - - public string AppBarTextRefresh - { - get { return "Refresh"; } - } - - public string AppBarTextSaveSettings - { - get { return "Save"; } - } - - public string AppBarTextCancelSettings - { - get { return "Cancel"; } - } - - - ////public override void Cleanup() ////{ //// // Clean up if needed @@ -511,136 +717,8 @@ namespace MyFriendsAround.WP7.ViewModel //// base.Cleanup(); ////} - - /// - /// The property's name. - /// - public const string PushPinsPropertyName = "PushPins"; - private ObservableCollection _PushPins = new ObservableCollection(); - /// - /// Gets the PushPins property. - /// - public ObservableCollection PushPins - { - get - { - return _PushPins; - } - - set - { - if (_PushPins == value) - { - return; - } - - _PushPins = value; - - // Update bindings, no broadcast - RaisePropertyChanged(PushPinsPropertyName); - - //// Update bindings and broadcast change using GalaSoft.MvvmLight.Messenging - //RaisePropertyChanged(PushPinsPropertyName, oldValue, value, true); - } - } - - - /// - /// The property's name. - /// - public const string MapZoomPropertyName = "MapZoom"; - - private int _mapZoom = 1; - - /// - /// Gets the MapZoom property. - /// - public int MapZoom - { - get - { - return _mapZoom; - } - - set - { - if (_mapZoom == value) - { - return; - } - _mapZoom = value; - - // Update bindings, no broadcast - RaisePropertyChanged(MapZoomPropertyName); - } - } - - - /// - /// The property's name. - /// - public const string MapCenterPropertyName = "MapCenter"; - private GeoCoordinate _mapCenter = new GeoCoordinate(0, 0); - - /// - /// Gets the MapCenter property. - /// - public GeoCoordinate MapCenter - { - get - { - return _mapCenter; - } - - set - { - if (_mapCenter == value) - { - return; - } - - var oldValue = _mapCenter; - _mapCenter = value; - - // Update bindings, no broadcast - RaisePropertyChanged(MapCenterPropertyName); - //// Update bindings and broadcast change using GalaSoft.MvvmLight.Messenging - //RaisePropertyChanged(MapCenterPropertyName, oldValue, value, true); - } - } - - - /// - /// The property's name. - /// - public const string IsBusyPropertyName = "IsBusy"; - - private bool _isBusy = false; - - /// - /// Gets the IsBusy property. - /// - public bool IsBusy - { - get - { - return _isBusy; - } - - set - { - if (_isBusy == value) - { - return; - } - - var oldValue = _isBusy; - _isBusy = value; - - // Update bindings, no broadcast - RaisePropertyChanged(IsBusyPropertyName); - } - } + #endregion } + } \ No newline at end of file diff --git a/main/MyFriendsAround.WP7/Views/MainPage.xaml b/main/MyFriendsAround.WP7/Views/MainPage.xaml index 12575aa..346f080 100644 --- a/main/MyFriendsAround.WP7/Views/MainPage.xaml +++ b/main/MyFriendsAround.WP7/Views/MainPage.xaml @@ -20,7 +20,7 @@ DataContext="{Binding Main, Source={StaticResource Locator}}" xmlns:my="clr-namespace:Microsoft.Phone.Controls.Maps;assembly=Microsoft.Phone.Controls.Maps" xmlns:Preview="clr-namespace:Phone7.Fx.Preview;assembly=Phone7.Fx.Preview" - xmlns:binding="clr-namespace:Coding4Fun.Phone.Controls.Binding;assembly=Coding4Fun.Phone.Controls"> + xmlns:binding="clr-namespace:Coding4Fun.Phone.Controls.Binding;assembly=Coding4Fun.Phone.Controls" xmlns:Core="clr-namespace:Microsoft.Phone.Controls.Maps.Core;assembly=Microsoft.Phone.Controls.Maps"> @@ -41,18 +41,17 @@ + HorizontalAlignment="Left"> - + - - + + + + + + + + + + + - - - - - - - - + + + + + + + + + + + + + @@ -131,14 +161,14 @@ Foreground="{StaticResource PhoneAccentBrush}" Style="{StaticResource PhoneTextNormalStyle}" /> + Height="80" > - + BorderThickness="0" Opacity="1"> + Text="{Binding MyName, Mode=OneWay}" Opacity="1" /> @@ -172,6 +202,10 @@ + @@ -189,19 +223,4 @@ - - - - \ No newline at end of file diff --git a/main/MyFriendsAround.WP7/Views/MainPage.xaml.cs b/main/MyFriendsAround.WP7/Views/MainPage.xaml.cs index 9675a1e..de0192e 100644 --- a/main/MyFriendsAround.WP7/Views/MainPage.xaml.cs +++ b/main/MyFriendsAround.WP7/Views/MainPage.xaml.cs @@ -1,16 +1,22 @@ using System; +using System.Device.Location; using System.Security; using System.Windows; +using System.Windows.Data; using GalaSoft.MvvmLight.Messaging; using GalaSoft.MvvmLight.Threading; using Microsoft.Phone.Controls; +using Microsoft.Phone.Controls.Maps; using Microsoft.Silverlight.Testing; +using MyFriendsAround.WP7.ViewModel; using MyFriendsAround.WP7.Views; namespace MyFriendsAround.WP7 { public partial class MainPage : PhoneApplicationPage { + //private Map MyMap; + // Constructor public MainPage() { @@ -37,6 +43,8 @@ namespace MyFriendsAround.WP7 } + + void MainPage_Loaded(object sender, RoutedEventArgs e) { #if TESTING @@ -52,6 +60,16 @@ namespace MyFriendsAround.WP7 { bool navigateBackSuccessfull = imobileTPage.NavigateBack(); arg.Cancel = navigateBackSuccessfull; }; (Application.Current.RootVisual as PhoneApplicationFrame).Content = testPage; + + map.SetView(LocationRect.CreateLocationRect()); + } + + private void map_ViewChangeEnd(object sender, MapEventArgs e) + { + //to workaround the issue + // https://connect.microsoft.com/VisualStudio/feedback/details/643990/wp7-bing-maps-control-throwing-unspecified-error-with-mapitemscontrol + // + (DataContext as MainViewModel).MapViewChangedCommand.Execute(map.BoundingRectangle); } } diff --git a/main/MyFriendsAround.WP7/icons/appbar.location.png b/main/MyFriendsAround.WP7/icons/appbar.location.png new file mode 100644 index 0000000..41d7ecf Binary files /dev/null and b/main/MyFriendsAround.WP7/icons/appbar.location.png differ