initial commit
							
								
								
									
										407
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,407 @@ | |||||||
|  | Ref/*.snk | ||||||
|  |  | ||||||
|  | # globs | ||||||
|  | Makefile.in | ||||||
|  | *.userprefs | ||||||
|  | *.usertasks | ||||||
|  | config.make | ||||||
|  | config.status | ||||||
|  | aclocal.m4 | ||||||
|  | install-sh | ||||||
|  | autom4te.cache/ | ||||||
|  | *.tar.gz | ||||||
|  | tarballs/ | ||||||
|  | test-results/ | ||||||
|  |  | ||||||
|  | # Mac bundle stuff | ||||||
|  | *.dmg | ||||||
|  | *.app | ||||||
|  |  | ||||||
|  | # content below from: https://github.com/github/gitignore/blob/main/Global/macOS.gitignore | ||||||
|  | # General | ||||||
|  | .DS_Store | ||||||
|  | .AppleDouble | ||||||
|  | .LSOverride | ||||||
|  |  | ||||||
|  | # Icon must end with two \r | ||||||
|  | Icon | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # Thumbnails | ||||||
|  | ._* | ||||||
|  |  | ||||||
|  | # Files that might appear in the root of a volume | ||||||
|  | .DocumentRevisions-V100 | ||||||
|  | .fseventsd | ||||||
|  | .Spotlight-V100 | ||||||
|  | .TemporaryItems | ||||||
|  | .Trashes | ||||||
|  | .VolumeIcon.icns | ||||||
|  | .com.apple.timemachine.donotpresent | ||||||
|  |  | ||||||
|  | # Directories potentially created on remote AFP share | ||||||
|  | .AppleDB | ||||||
|  | .AppleDesktop | ||||||
|  | Network Trash Folder | ||||||
|  | Temporary Items | ||||||
|  | .apdisk | ||||||
|  |  | ||||||
|  | # content below from: https://github.com/github/gitignore/blob/main/Global/Windows.gitignore | ||||||
|  | # Windows thumbnail cache files | ||||||
|  | Thumbs.db | ||||||
|  | ehthumbs.db | ||||||
|  | ehthumbs_vista.db | ||||||
|  |  | ||||||
|  | # Dump file | ||||||
|  | *.stackdump | ||||||
|  |  | ||||||
|  | # Folder config file | ||||||
|  | [Dd]esktop.ini | ||||||
|  |  | ||||||
|  | # Recycle Bin used on file shares | ||||||
|  | $RECYCLE.BIN/ | ||||||
|  |  | ||||||
|  | # Windows Installer files | ||||||
|  | *.cab | ||||||
|  | *.msi | ||||||
|  | *.msix | ||||||
|  | *.msm | ||||||
|  | *.msp | ||||||
|  |  | ||||||
|  | # Windows shortcuts | ||||||
|  | *.lnk | ||||||
|  |  | ||||||
|  | # content below from: https://github.com/github/gitignore/blob/master/VisualStudio.gitignore | ||||||
|  | ## Ignore Visual Studio temporary files, build results, and | ||||||
|  | ## files generated by popular Visual Studio add-ons. | ||||||
|  | ## | ||||||
|  | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore | ||||||
|  |  | ||||||
|  | # User-specific files | ||||||
|  | *.suo | ||||||
|  | *.user | ||||||
|  | *.userosscache | ||||||
|  | *.sln.docstates | ||||||
|  |  | ||||||
|  | # User-specific files (MonoDevelop/Xamarin Studio) | ||||||
|  | *.userprefs | ||||||
|  |  | ||||||
|  | # Build results | ||||||
|  | [Dd]ebug/ | ||||||
|  | [Dd]ebugPublic/ | ||||||
|  | [Rr]elease/ | ||||||
|  | [Rr]eleases/ | ||||||
|  | x64/ | ||||||
|  | x86/ | ||||||
|  | bld/ | ||||||
|  | [Bb]in/ | ||||||
|  | [Oo]bj/ | ||||||
|  | [Ll]og/ | ||||||
|  |  | ||||||
|  | # Visual Studio 2015/2017 cache/options directory | ||||||
|  | .vs/ | ||||||
|  | # Uncomment if you have tasks that create the project's static files in wwwroot | ||||||
|  | #wwwroot/ | ||||||
|  |  | ||||||
|  | # Visual Studio 2017 auto generated files | ||||||
|  | Generated\ Files/ | ||||||
|  |  | ||||||
|  | # MSTest test Results | ||||||
|  | [Tt]est[Rr]esult*/ | ||||||
|  | [Bb]uild[Ll]og.* | ||||||
|  |  | ||||||
|  | # NUNIT | ||||||
|  | *.VisualState.xml | ||||||
|  | TestResult.xml | ||||||
|  |  | ||||||
|  | # Build Results of an ATL Project | ||||||
|  | [Dd]ebugPS/ | ||||||
|  | [Rr]eleasePS/ | ||||||
|  | dlldata.c | ||||||
|  |  | ||||||
|  | # Benchmark Results | ||||||
|  | BenchmarkDotNet.Artifacts/ | ||||||
|  |  | ||||||
|  | # .NET Core | ||||||
|  | project.lock.json | ||||||
|  | project.fragment.lock.json | ||||||
|  | artifacts/ | ||||||
|  |  | ||||||
|  | # StyleCop | ||||||
|  | StyleCopReport.xml | ||||||
|  |  | ||||||
|  | # Files built by Visual Studio | ||||||
|  | *_i.c | ||||||
|  | *_p.c | ||||||
|  | *_h.h | ||||||
|  | *.ilk | ||||||
|  | *.meta | ||||||
|  | *.obj | ||||||
|  | *.iobj | ||||||
|  | *.pch | ||||||
|  | *.pdb | ||||||
|  | *.ipdb | ||||||
|  | *.pgc | ||||||
|  | *.pgd | ||||||
|  | *.rsp | ||||||
|  | *.sbr | ||||||
|  | *.tlb | ||||||
|  | *.tli | ||||||
|  | *.tlh | ||||||
|  | *.tmp | ||||||
|  | *.tmp_proj | ||||||
|  | *_wpftmp.csproj | ||||||
|  | *.log | ||||||
|  | *.vspscc | ||||||
|  | *.vssscc | ||||||
|  | .builds | ||||||
|  | *.pidb | ||||||
|  | *.svclog | ||||||
|  | *.scc | ||||||
|  |  | ||||||
|  | # Chutzpah Test files | ||||||
|  | _Chutzpah* | ||||||
|  |  | ||||||
|  | # Visual C++ cache files | ||||||
|  | ipch/ | ||||||
|  | *.aps | ||||||
|  | *.ncb | ||||||
|  | *.opendb | ||||||
|  | *.opensdf | ||||||
|  | *.sdf | ||||||
|  | *.cachefile | ||||||
|  | *.VC.db | ||||||
|  | *.VC.VC.opendb | ||||||
|  |  | ||||||
|  | # Visual Studio profiler | ||||||
|  | *.psess | ||||||
|  | *.vsp | ||||||
|  | *.vspx | ||||||
|  | *.sap | ||||||
|  |  | ||||||
|  | # Visual Studio Trace Files | ||||||
|  | *.e2e | ||||||
|  |  | ||||||
|  | # TFS 2012 Local Workspace | ||||||
|  | $tf/ | ||||||
|  |  | ||||||
|  | # Guidance Automation Toolkit | ||||||
|  | *.gpState | ||||||
|  |  | ||||||
|  | # ReSharper is a .NET coding add-in | ||||||
|  | _ReSharper*/ | ||||||
|  | *.[Rr]e[Ss]harper | ||||||
|  | *.DotSettings.user | ||||||
|  |  | ||||||
|  | # JustCode is a .NET coding add-in | ||||||
|  | .JustCode | ||||||
|  |  | ||||||
|  | # TeamCity is a build add-in | ||||||
|  | _TeamCity* | ||||||
|  |  | ||||||
|  | # DotCover is a Code Coverage Tool | ||||||
|  | *.dotCover | ||||||
|  |  | ||||||
|  | # AxoCover is a Code Coverage Tool | ||||||
|  | .axoCover/* | ||||||
|  | !.axoCover/settings.json | ||||||
|  |  | ||||||
|  | # Visual Studio code coverage results | ||||||
|  | *.coverage | ||||||
|  | *.coveragexml | ||||||
|  |  | ||||||
|  | # NCrunch | ||||||
|  | _NCrunch_* | ||||||
|  | .*crunch*.local.xml | ||||||
|  | nCrunchTemp_* | ||||||
|  |  | ||||||
|  | # MightyMoose | ||||||
|  | *.mm.* | ||||||
|  | AutoTest.Net/ | ||||||
|  |  | ||||||
|  | # Web workbench (sass) | ||||||
|  | .sass-cache/ | ||||||
|  |  | ||||||
|  | # Installshield output folder | ||||||
|  | [Ee]xpress/ | ||||||
|  |  | ||||||
|  | # DocProject is a documentation generator add-in | ||||||
|  | DocProject/buildhelp/ | ||||||
|  | DocProject/Help/*.HxT | ||||||
|  | DocProject/Help/*.HxC | ||||||
|  | DocProject/Help/*.hhc | ||||||
|  | DocProject/Help/*.hhk | ||||||
|  | DocProject/Help/*.hhp | ||||||
|  | DocProject/Help/Html2 | ||||||
|  | DocProject/Help/html | ||||||
|  |  | ||||||
|  | # Click-Once directory | ||||||
|  | publish/ | ||||||
|  |  | ||||||
|  | # Publish Web Output | ||||||
|  | *.[Pp]ublish.xml | ||||||
|  | *.azurePubxml | ||||||
|  | # Note: Comment the next line if you want to checkin your web deploy settings, | ||||||
|  | # but database connection strings (with potential passwords) will be unencrypted | ||||||
|  | *.pubxml | ||||||
|  | *.publishproj | ||||||
|  |  | ||||||
|  | # Microsoft Azure Web App publish settings. Comment the next line if you want to | ||||||
|  | # checkin your Azure Web App publish settings, but sensitive information contained | ||||||
|  | # in these scripts will be unencrypted | ||||||
|  | PublishScripts/ | ||||||
|  |  | ||||||
|  | # NuGet Packages | ||||||
|  | *.nupkg | ||||||
|  | # The packages folder can be ignored because of Package Restore | ||||||
|  | **/[Pp]ackages/* | ||||||
|  | # except build/, which is used as an MSBuild target. | ||||||
|  | !**/[Pp]ackages/build/ | ||||||
|  | # Uncomment if necessary however generally it will be regenerated when needed | ||||||
|  | #!**/[Pp]ackages/repositories.config | ||||||
|  | # NuGet v3's project.json files produces more ignorable files | ||||||
|  | *.nuget.props | ||||||
|  | *.nuget.targets | ||||||
|  |  | ||||||
|  | # Microsoft Azure Build Output | ||||||
|  | csx/ | ||||||
|  | *.build.csdef | ||||||
|  |  | ||||||
|  | # Microsoft Azure Emulator | ||||||
|  | ecf/ | ||||||
|  | rcf/ | ||||||
|  |  | ||||||
|  | # Windows Store app package directories and files | ||||||
|  | AppPackages/ | ||||||
|  | BundleArtifacts/ | ||||||
|  | Package.StoreAssociation.xml | ||||||
|  | _pkginfo.txt | ||||||
|  | *.appx | ||||||
|  |  | ||||||
|  | # Visual Studio cache files | ||||||
|  | # files ending in .cache can be ignored | ||||||
|  | *.[Cc]ache | ||||||
|  | # but keep track of directories ending in .cache | ||||||
|  | !*.[Cc]ache/ | ||||||
|  |  | ||||||
|  | # Others | ||||||
|  | ClientBin/ | ||||||
|  | ~$* | ||||||
|  | *~ | ||||||
|  | *.dbmdl | ||||||
|  | *.dbproj.schemaview | ||||||
|  | *.jfm | ||||||
|  | *.pfx | ||||||
|  | *.publishsettings | ||||||
|  | orleans.codegen.cs | ||||||
|  |  | ||||||
|  | # Including strong name files can present a security risk | ||||||
|  | # (https://github.com/github/gitignore/pull/2483#issue-259490424) | ||||||
|  | #*.snk | ||||||
|  |  | ||||||
|  | # Since there are multiple workflows, uncomment next line to ignore bower_components | ||||||
|  | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) | ||||||
|  | #bower_components/ | ||||||
|  |  | ||||||
|  | # RIA/Silverlight projects | ||||||
|  | Generated_Code/ | ||||||
|  |  | ||||||
|  | # Backup & report files from converting an old project file | ||||||
|  | # to a newer Visual Studio version. Backup files are not needed, | ||||||
|  | # because we have git ;-) | ||||||
|  | _UpgradeReport_Files/ | ||||||
|  | Backup*/ | ||||||
|  | UpgradeLog*.XML | ||||||
|  | UpgradeLog*.htm | ||||||
|  | ServiceFabricBackup/ | ||||||
|  | *.rptproj.bak | ||||||
|  |  | ||||||
|  | # SQL Server files | ||||||
|  | *.mdf | ||||||
|  | *.ldf | ||||||
|  | *.ndf | ||||||
|  |  | ||||||
|  | # Business Intelligence projects | ||||||
|  | *.rdl.data | ||||||
|  | *.bim.layout | ||||||
|  | *.bim_*.settings | ||||||
|  | *.rptproj.rsuser | ||||||
|  |  | ||||||
|  | # Microsoft Fakes | ||||||
|  | FakesAssemblies/ | ||||||
|  |  | ||||||
|  | # GhostDoc plugin setting file | ||||||
|  | *.GhostDoc.xml | ||||||
|  |  | ||||||
|  | # Node.js Tools for Visual Studio | ||||||
|  | .ntvs_analysis.dat | ||||||
|  | node_modules/ | ||||||
|  |  | ||||||
|  | # Visual Studio 6 build log | ||||||
|  | *.plg | ||||||
|  |  | ||||||
|  | # Visual Studio 6 workspace options file | ||||||
|  | *.opt | ||||||
|  |  | ||||||
|  | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) | ||||||
|  | *.vbw | ||||||
|  |  | ||||||
|  | # Visual Studio LightSwitch build output | ||||||
|  | **/*.HTMLClient/GeneratedArtifacts | ||||||
|  | **/*.DesktopClient/GeneratedArtifacts | ||||||
|  | **/*.DesktopClient/ModelManifest.xml | ||||||
|  | **/*.Server/GeneratedArtifacts | ||||||
|  | **/*.Server/ModelManifest.xml | ||||||
|  | _Pvt_Extensions | ||||||
|  |  | ||||||
|  | # Paket dependency manager | ||||||
|  | .paket/paket.exe | ||||||
|  | paket-files/ | ||||||
|  |  | ||||||
|  | # FAKE - F# Make | ||||||
|  | .fake/ | ||||||
|  |  | ||||||
|  | # JetBrains Rider | ||||||
|  | .idea/ | ||||||
|  | *.sln.iml | ||||||
|  |  | ||||||
|  | # CodeRush personal settings | ||||||
|  | .cr/personal | ||||||
|  |  | ||||||
|  | # Python Tools for Visual Studio (PTVS) | ||||||
|  | __pycache__/ | ||||||
|  | *.pyc | ||||||
|  |  | ||||||
|  | # Cake - Uncomment if you are using it | ||||||
|  | # tools/** | ||||||
|  | # !tools/packages.config | ||||||
|  |  | ||||||
|  | # Tabs Studio | ||||||
|  | *.tss | ||||||
|  |  | ||||||
|  | # Telerik's JustMock configuration file | ||||||
|  | *.jmconfig | ||||||
|  |  | ||||||
|  | # BizTalk build output | ||||||
|  | *.btp.cs | ||||||
|  | *.btm.cs | ||||||
|  | *.odx.cs | ||||||
|  | *.xsd.cs | ||||||
|  |  | ||||||
|  | # OpenCover UI analysis results | ||||||
|  | OpenCover/ | ||||||
|  |  | ||||||
|  | # Azure Stream Analytics local run output | ||||||
|  | ASALocalRun/ | ||||||
|  |  | ||||||
|  | # MSBuild Binary and Structured Log | ||||||
|  | *.binlog | ||||||
|  |  | ||||||
|  | # NVidia Nsight GPU debugger configuration file | ||||||
|  | *.nvuser | ||||||
|  |  | ||||||
|  | # MFractors (Xamarin productivity tool) working folder | ||||||
|  | .mfractor/ | ||||||
|  |  | ||||||
|  | # Local History for Visual Studio | ||||||
|  | .localhistory/ | ||||||
							
								
								
									
										32
									
								
								Gallery.Share/App.xaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,32 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8" ?> | ||||||
|  | <Application xmlns="http://xamarin.com/schemas/2014/forms" | ||||||
|  |              xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" | ||||||
|  |              x:Class="Gallery.App"> | ||||||
|  |     <!-- | ||||||
|  |         Define global resources and styles here, that apply to all pages in your app. | ||||||
|  |     --> | ||||||
|  |     <Application.Resources> | ||||||
|  |         <ResourceDictionary> | ||||||
|  |             <Color x:Key="Primary">#2196F3</Color> | ||||||
|  |             <Style TargetType="Button"> | ||||||
|  |                 <Setter Property="TextColor" Value="White"></Setter> | ||||||
|  |                 <Setter Property="VisualStateManager.VisualStateGroups"> | ||||||
|  |                     <VisualStateGroupList> | ||||||
|  |                         <VisualStateGroup x:Name="CommonStates"> | ||||||
|  |                             <VisualState x:Name="Normal"> | ||||||
|  |                                 <VisualState.Setters> | ||||||
|  |                                     <Setter Property="BackgroundColor" Value="{StaticResource Primary}" /> | ||||||
|  |                                 </VisualState.Setters> | ||||||
|  |                             </VisualState> | ||||||
|  |                             <VisualState x:Name="Disabled"> | ||||||
|  |                                 <VisualState.Setters> | ||||||
|  |                                     <Setter Property="BackgroundColor" Value="#332196F3" /> | ||||||
|  |                                 </VisualState.Setters> | ||||||
|  |                             </VisualState> | ||||||
|  |                         </VisualStateGroup> | ||||||
|  |                     </VisualStateGroupList> | ||||||
|  |                 </Setter> | ||||||
|  |             </Style> | ||||||
|  |         </ResourceDictionary>         | ||||||
|  |     </Application.Resources> | ||||||
|  | </Application> | ||||||
							
								
								
									
										32
									
								
								Gallery.Share/App.xaml.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,32 @@ | |||||||
|  | using System; | ||||||
|  | using Xamarin.Forms; | ||||||
|  | using Xamarin.Forms.Xaml; | ||||||
|  | using Gallery.Services; | ||||||
|  | using Gallery.Views; | ||||||
|  |  | ||||||
|  | namespace Gallery | ||||||
|  | { | ||||||
|  |     public partial class App : Application | ||||||
|  |     { | ||||||
|  |  | ||||||
|  |         public App() | ||||||
|  |         { | ||||||
|  |             InitializeComponent(); | ||||||
|  |  | ||||||
|  |             DependencyService.Register<MockDataStore>(); | ||||||
|  |             MainPage = new AppShell(); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         protected override void OnStart() | ||||||
|  |         { | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         protected override void OnSleep() | ||||||
|  |         { | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         protected override void OnResume() | ||||||
|  |         { | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										136
									
								
								Gallery.Share/AppShell.xaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,136 @@ | |||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <Shell xmlns="http://xamarin.com/schemas/2014/forms"  | ||||||
|  |        xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" | ||||||
|  |        xmlns:local="clr-namespace:Gallery.Views" | ||||||
|  |        Title="Gallery" | ||||||
|  |        x:Class="Gallery.AppShell"> | ||||||
|  |  | ||||||
|  |     <!-- | ||||||
|  |         The overall app visual hierarchy is defined here, along with navigation. | ||||||
|  |      | ||||||
|  |         https://docs.microsoft.com/xamarin/xamarin-forms/app-fundamentals/shell/ | ||||||
|  |     --> | ||||||
|  |  | ||||||
|  |     <Shell.Resources> | ||||||
|  |         <ResourceDictionary> | ||||||
|  |             <Style x:Key="BaseStyle" TargetType="Element"> | ||||||
|  |                 <Setter Property="Shell.BackgroundColor" Value="{StaticResource Primary}" /> | ||||||
|  |                 <Setter Property="Shell.ForegroundColor" Value="White" /> | ||||||
|  |                 <Setter Property="Shell.TitleColor" Value="White" /> | ||||||
|  |                 <Setter Property="Shell.DisabledColor" Value="#B4FFFFFF" /> | ||||||
|  |                 <Setter Property="Shell.UnselectedColor" Value="#95FFFFFF" /> | ||||||
|  |                 <Setter Property="Shell.TabBarBackgroundColor" Value="{StaticResource Primary}" /> | ||||||
|  |                 <Setter Property="Shell.TabBarForegroundColor" Value="White"/> | ||||||
|  |                 <Setter Property="Shell.TabBarUnselectedColor" Value="#95FFFFFF"/> | ||||||
|  |                 <Setter Property="Shell.TabBarTitleColor" Value="White"/> | ||||||
|  |             </Style> | ||||||
|  |             <Style TargetType="TabBar" BasedOn="{StaticResource BaseStyle}" /> | ||||||
|  |             <Style TargetType="FlyoutItem" BasedOn="{StaticResource BaseStyle}" /> | ||||||
|  |  | ||||||
|  |             <!-- | ||||||
|  |             Default Styles for all Flyout Items | ||||||
|  |             https://docs.microsoft.com/xamarin/xamarin-forms/app-fundamentals/shell/flyout#flyoutitem-and-menuitem-style-classes | ||||||
|  |             --> | ||||||
|  |             <Style Class="FlyoutItemLabelStyle" TargetType="Label"> | ||||||
|  |                 <Setter Property="TextColor" Value="White"></Setter> | ||||||
|  |             </Style> | ||||||
|  |             <Style Class="FlyoutItemLayoutStyle" TargetType="Layout" ApplyToDerivedTypes="True"> | ||||||
|  |                 <Setter Property="VisualStateManager.VisualStateGroups"> | ||||||
|  |                     <VisualStateGroupList> | ||||||
|  |                         <VisualStateGroup x:Name="CommonStates"> | ||||||
|  |                             <VisualState x:Name="Normal"> | ||||||
|  |                                 <VisualState.Setters> | ||||||
|  |                                     <Setter Property="BackgroundColor" Value="{x:OnPlatform UWP=Transparent, iOS=White}" /> | ||||||
|  |                                     <Setter TargetName="FlyoutItemLabel" Property="Label.TextColor" Value="{StaticResource Primary}" /> | ||||||
|  |                                 </VisualState.Setters> | ||||||
|  |                             </VisualState> | ||||||
|  |                             <VisualState x:Name="Selected"> | ||||||
|  |                                 <VisualState.Setters> | ||||||
|  |                                     <Setter Property="BackgroundColor" Value="{StaticResource Primary}" /> | ||||||
|  |                                 </VisualState.Setters> | ||||||
|  |                             </VisualState> | ||||||
|  |                         </VisualStateGroup> | ||||||
|  |                     </VisualStateGroupList> | ||||||
|  |                 </Setter> | ||||||
|  |             </Style> | ||||||
|  |  | ||||||
|  |             <!-- | ||||||
|  |             Custom Style you can apply to any Flyout Item | ||||||
|  |             --> | ||||||
|  |             <Style Class="MenuItemLayoutStyle" TargetType="Layout" ApplyToDerivedTypes="True"> | ||||||
|  |                 <Setter Property="VisualStateManager.VisualStateGroups"> | ||||||
|  |                     <VisualStateGroupList> | ||||||
|  |                         <VisualStateGroup x:Name="CommonStates"> | ||||||
|  |                             <VisualState x:Name="Normal"> | ||||||
|  |                                 <VisualState.Setters> | ||||||
|  |                                     <Setter TargetName="FlyoutItemLabel" Property="Label.TextColor" Value="{StaticResource Primary}" /> | ||||||
|  |                                 </VisualState.Setters> | ||||||
|  |                             </VisualState> | ||||||
|  |                         </VisualStateGroup> | ||||||
|  |                     </VisualStateGroupList> | ||||||
|  |                 </Setter> | ||||||
|  |             </Style> | ||||||
|  |         </ResourceDictionary> | ||||||
|  |     </Shell.Resources> | ||||||
|  |  | ||||||
|  |     <!--  | ||||||
|  |         When the Flyout is visible this defines the content to display in the flyout. | ||||||
|  |         FlyoutDisplayOptions="AsMultipleItems" will create a separate flyout item for each child element     | ||||||
|  |         https://docs.microsoft.com/dotnet/api/xamarin.forms.shellgroupitem.flyoutdisplayoptions?view=xamarin-forms | ||||||
|  |     --> | ||||||
|  |     <FlyoutItem Title="About" Icon="icon_about.png"> | ||||||
|  |         <ShellContent Route="AboutPage" ContentTemplate="{DataTemplate local:AboutPage}" /> | ||||||
|  |     </FlyoutItem> | ||||||
|  |     <FlyoutItem Title="Browse" Icon="icon_feed.png"> | ||||||
|  |         <ShellContent Route="ItemsPage" ContentTemplate="{DataTemplate local:ItemsPage}" /> | ||||||
|  |     </FlyoutItem> | ||||||
|  |  | ||||||
|  |     <!-- When the Flyout is visible this will be a menu item you can tie a click behavior to  --> | ||||||
|  |     <MenuItem Text="Logout" StyleClass="MenuItemLayoutStyle" Clicked="OnMenuItemClicked"> | ||||||
|  |     </MenuItem> | ||||||
|  |  | ||||||
|  |     <!-- | ||||||
|  |         TabBar lets you define content that won't show up in a flyout menu. When this content is active | ||||||
|  |         the flyout menu won't be available. This is useful for creating areas of the application where  | ||||||
|  |         you don't want users to be able to navigate away from. If you would like to navigate to this  | ||||||
|  |         content you can do so by calling  | ||||||
|  |         await Shell.Current.GoToAsync("//LoginPage"); | ||||||
|  |     --> | ||||||
|  |     <TabBar> | ||||||
|  |         <ShellContent Route="LoginPage" ContentTemplate="{DataTemplate local:LoginPage}" /> | ||||||
|  |     </TabBar> | ||||||
|  |  | ||||||
|  |     <!-- Optional Templates  | ||||||
|  |     // These may be provided inline as below or as separate classes. | ||||||
|  |  | ||||||
|  |     // This header appears at the top of the Flyout. | ||||||
|  |     // https://docs.microsoft.com/xamarin/xamarin-forms/app-fundamentals/shell/flyout#flyout-header | ||||||
|  |     <Shell.FlyoutHeaderTemplate> | ||||||
|  |         <DataTemplate> | ||||||
|  |             <Grid>ContentHere</Grid> | ||||||
|  |         </DataTemplate> | ||||||
|  |     </Shell.FlyoutHeaderTemplate> | ||||||
|  |  | ||||||
|  |     // ItemTemplate is for ShellItems as displayed in a Flyout | ||||||
|  |     // https://docs.microsoft.com/xamarin/xamarin-forms/app-fundamentals/shell/flyout#define-flyoutitem-appearance | ||||||
|  |     <Shell.ItemTemplate> | ||||||
|  |         <DataTemplate> | ||||||
|  |             <ContentView> | ||||||
|  |                 Bindable Properties: Title, Icon | ||||||
|  |             </ContentView> | ||||||
|  |         </DataTemplate> | ||||||
|  |     </Shell.ItemTemplate> | ||||||
|  |  | ||||||
|  |     // MenuItemTemplate is for MenuItems as displayed in a Flyout | ||||||
|  |     // https://docs.microsoft.com/xamarin/xamarin-forms/app-fundamentals/shell/flyout#define-menuitem-appearance | ||||||
|  |     <Shell.MenuItemTemplate> | ||||||
|  |         <DataTemplate> | ||||||
|  |             <ContentView> | ||||||
|  |                 Bindable Properties: Text, Icon | ||||||
|  |             </ContentView> | ||||||
|  |         </DataTemplate> | ||||||
|  |     </Shell.MenuItemTemplate> | ||||||
|  |  | ||||||
|  |     --> | ||||||
|  |  | ||||||
|  | </Shell> | ||||||
							
								
								
									
										23
									
								
								Gallery.Share/AppShell.xaml.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,23 @@ | |||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using Gallery.ViewModels; | ||||||
|  | using Gallery.Views; | ||||||
|  | using Xamarin.Forms; | ||||||
|  |  | ||||||
|  | namespace Gallery | ||||||
|  | { | ||||||
|  |     public partial class AppShell : Xamarin.Forms.Shell | ||||||
|  |     { | ||||||
|  |         public AppShell() | ||||||
|  |         { | ||||||
|  |             InitializeComponent(); | ||||||
|  |             Routing.RegisterRoute(nameof(ItemDetailPage), typeof(ItemDetailPage)); | ||||||
|  |             Routing.RegisterRoute(nameof(NewItemPage), typeof(NewItemPage)); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         private async void OnMenuItemClicked(object sender, EventArgs e) | ||||||
|  |         { | ||||||
|  |             await Shell.Current.GoToAsync("//LoginPage"); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										79
									
								
								Gallery.Share/Gallery.Share.projitems
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,79 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects> | ||||||
|  |     <HasSharedItems>true</HasSharedItems> | ||||||
|  |     <SharedGUID>{E72B5C40-090B-4A1C-9170-BD33C14A9A91}</SharedGUID> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <PropertyGroup Label="Configuration"> | ||||||
|  |     <Import_RootNamespace>Gallery.Share</Import_RootNamespace> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <ItemGroup> | ||||||
|  |     <Compile Include="$(MSBuildThisFileDirectory)Models\Item.cs" /> | ||||||
|  |     <Compile Include="$(MSBuildThisFileDirectory)Services\IDataStore.cs" /> | ||||||
|  |     <Compile Include="$(MSBuildThisFileDirectory)Services\MockDataStore.cs" /> | ||||||
|  |     <Compile Include="$(MSBuildThisFileDirectory)ViewModels\AboutViewModel.cs" /> | ||||||
|  |     <Compile Include="$(MSBuildThisFileDirectory)ViewModels\BaseViewModel.cs" /> | ||||||
|  |     <Compile Include="$(MSBuildThisFileDirectory)ViewModels\ItemDetailViewModel.cs" /> | ||||||
|  |     <Compile Include="$(MSBuildThisFileDirectory)ViewModels\ItemsViewModel.cs" /> | ||||||
|  |     <Compile Include="$(MSBuildThisFileDirectory)ViewModels\LoginViewModel.cs" /> | ||||||
|  |     <Compile Include="$(MSBuildThisFileDirectory)ViewModels\NewItemViewModel.cs" /> | ||||||
|  |     <Compile Include="$(MSBuildThisFileDirectory)Views\AboutPage.xaml.cs"> | ||||||
|  |       <DependentUpon>Views\AboutPage.xaml</DependentUpon> | ||||||
|  |     </Compile> | ||||||
|  |     <Compile Include="$(MSBuildThisFileDirectory)Views\ItemDetailPage.xaml.cs"> | ||||||
|  |       <DependentUpon>Views\ItemDetailPage.xaml</DependentUpon> | ||||||
|  |     </Compile> | ||||||
|  |     <Compile Include="$(MSBuildThisFileDirectory)Views\ItemsPage.xaml.cs"> | ||||||
|  |       <DependentUpon>Views\ItemsPage.xaml</DependentUpon> | ||||||
|  |     </Compile> | ||||||
|  |     <Compile Include="$(MSBuildThisFileDirectory)Views\LoginPage.xaml.cs"> | ||||||
|  |       <DependentUpon>Views\LoginPage.xaml</DependentUpon> | ||||||
|  |     </Compile> | ||||||
|  |     <Compile Include="$(MSBuildThisFileDirectory)Views\NewItemPage.xaml.cs"> | ||||||
|  |       <DependentUpon>Views\NewItemPage.xaml</DependentUpon> | ||||||
|  |     </Compile> | ||||||
|  |     <Compile Include="$(MSBuildThisFileDirectory)App.xaml.cs"> | ||||||
|  |       <DependentUpon>App.xaml</DependentUpon> | ||||||
|  |     </Compile> | ||||||
|  |     <Compile Include="$(MSBuildThisFileDirectory)AppShell.xaml.cs"> | ||||||
|  |       <DependentUpon>AppShell.xaml</DependentUpon> | ||||||
|  |     </Compile> | ||||||
|  |   </ItemGroup> | ||||||
|  |   <ItemGroup> | ||||||
|  |     <Folder Include="$(MSBuildThisFileDirectory)Models\" /> | ||||||
|  |     <Folder Include="$(MSBuildThisFileDirectory)Services\" /> | ||||||
|  |     <Folder Include="$(MSBuildThisFileDirectory)ViewModels\" /> | ||||||
|  |     <Folder Include="$(MSBuildThisFileDirectory)Views\" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |   <ItemGroup> | ||||||
|  |     <EmbeddedResource Include="$(MSBuildThisFileDirectory)Views\AboutPage.xaml"> | ||||||
|  |       <SubType>Designer</SubType> | ||||||
|  |       <Generator>MSBuild:UpdateDesignTimeXaml</Generator> | ||||||
|  |     </EmbeddedResource> | ||||||
|  |     <EmbeddedResource Include="$(MSBuildThisFileDirectory)Views\ItemDetailPage.xaml"> | ||||||
|  |       <SubType>Designer</SubType> | ||||||
|  |       <Generator>MSBuild:UpdateDesignTimeXaml</Generator> | ||||||
|  |     </EmbeddedResource> | ||||||
|  |     <EmbeddedResource Include="$(MSBuildThisFileDirectory)Views\ItemsPage.xaml"> | ||||||
|  |       <SubType>Designer</SubType> | ||||||
|  |       <Generator>MSBuild:UpdateDesignTimeXaml</Generator> | ||||||
|  |     </EmbeddedResource> | ||||||
|  |     <EmbeddedResource Include="$(MSBuildThisFileDirectory)Views\LoginPage.xaml"> | ||||||
|  |       <SubType>Designer</SubType> | ||||||
|  |       <Generator>MSBuild:UpdateDesignTimeXaml</Generator> | ||||||
|  |     </EmbeddedResource> | ||||||
|  |     <EmbeddedResource Include="$(MSBuildThisFileDirectory)Views\NewItemPage.xaml"> | ||||||
|  |       <SubType>Designer</SubType> | ||||||
|  |       <Generator>MSBuild:UpdateDesignTimeXaml</Generator> | ||||||
|  |     </EmbeddedResource> | ||||||
|  |     <EmbeddedResource Include="$(MSBuildThisFileDirectory)App.xaml"> | ||||||
|  |       <SubType>Designer</SubType> | ||||||
|  |       <Generator>MSBuild:UpdateDesignTimeXaml</Generator> | ||||||
|  |     </EmbeddedResource> | ||||||
|  |     <EmbeddedResource Include="$(MSBuildThisFileDirectory)AppShell.xaml"> | ||||||
|  |       <SubType>Designer</SubType> | ||||||
|  |       <Generator>MSBuild:UpdateDesignTimeXaml</Generator> | ||||||
|  |     </EmbeddedResource> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
							
								
								
									
										11
									
								
								Gallery.Share/Gallery.Share.shproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,11 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <ProjectGuid>{E72B5C40-090B-4A1C-9170-BD33C14A9A91}</ProjectGuid> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> | ||||||
|  |   <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\CodeSharing\Microsoft.CodeSharing.Common.Default.props" /> | ||||||
|  |   <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\CodeSharing\Microsoft.CodeSharing.Common.props" /> | ||||||
|  |   <Import Project="Gallery.Share.projitems" Label="Shared" /> | ||||||
|  |   <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\CodeSharing\Microsoft.CodeSharing.CSharp.targets" /> | ||||||
|  | </Project> | ||||||
							
								
								
									
										34
									
								
								Gallery.Share/GettingStarted.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,34 @@ | |||||||
|  | Welcome to Xamarin.Forms! Here are some tips to get started building your app. | ||||||
|  |  | ||||||
|  | Building Your App UI | ||||||
|  | -------------------- | ||||||
|  |  | ||||||
|  | XAML Hot Reload quickly applies UI changes as you make them to your running app. | ||||||
|  | This is the most productive way to preview and iteratively create your UI. | ||||||
|  |  | ||||||
|  | Try it out: | ||||||
|  |  | ||||||
|  | 1. Run the app by clicking the Start Debugging (play) button in the above toolbar.  | ||||||
|  | 2. Open <MainProject>\Views\AboutPage.xaml. | ||||||
|  |    Don't stop the app - keep it running while making changes. | ||||||
|  | 3. Change something! Hint: change the Accent color on line 14 from "#96d1ff" to "Pink". | ||||||
|  | 4. Watch the About screen update on the device or emulator, with the logo background now pink. | ||||||
|  |  | ||||||
|  | Keep going and try more changes! | ||||||
|  |  | ||||||
|  | QuickStart Guide | ||||||
|  | ---------------- | ||||||
|  |  | ||||||
|  | Learn more of the fundamentals for building apps with Xamarin here: https://aka.ms/xamarin-quickstart | ||||||
|  |  | ||||||
|  | Your App Shell | ||||||
|  | -------------- | ||||||
|  |  | ||||||
|  | This template uses Shell, an app container that reduces the complexity of your apps by providing fundamental features including: | ||||||
|  |  | ||||||
|  | - A single place to describe the app's visual hierarchy. | ||||||
|  | - Common navigation such as a flyout menu and tabs. | ||||||
|  | - A URI-based navigation scheme that permits navigation to any page in the application. | ||||||
|  | - An integrated search handler. | ||||||
|  |  | ||||||
|  | Open AppShell.xaml to begin exploring. To learn more about Shell visit: https://docs.microsoft.com/xamarin/xamarin-forms/app-fundamentals/shell/introduction | ||||||
							
								
								
									
										11
									
								
								Gallery.Share/Models/Item.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,11 @@ | |||||||
|  | using System; | ||||||
|  |  | ||||||
|  | namespace Gallery.Models | ||||||
|  | { | ||||||
|  |     public class Item | ||||||
|  |     { | ||||||
|  |         public string Id { get; set; } | ||||||
|  |         public string Text { get; set; } | ||||||
|  |         public string Description { get; set; } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										15
									
								
								Gallery.Share/Services/IDataStore.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,15 @@ | |||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  |  | ||||||
|  | namespace Gallery.Services | ||||||
|  | { | ||||||
|  |     public interface IDataStore<T> | ||||||
|  |     { | ||||||
|  |         Task<bool> AddItemAsync(T item); | ||||||
|  |         Task<bool> UpdateItemAsync(T item); | ||||||
|  |         Task<bool> DeleteItemAsync(string id); | ||||||
|  |         Task<T> GetItemAsync(string id); | ||||||
|  |         Task<IEnumerable<T>> GetItemsAsync(bool forceRefresh = false); | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										60
									
								
								Gallery.Share/Services/MockDataStore.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,60 @@ | |||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.Linq; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using Gallery.Models; | ||||||
|  |  | ||||||
|  | namespace Gallery.Services | ||||||
|  | { | ||||||
|  |     public class MockDataStore : IDataStore<Item> | ||||||
|  |     { | ||||||
|  |         readonly List<Item> items; | ||||||
|  |  | ||||||
|  |         public MockDataStore() | ||||||
|  |         { | ||||||
|  |             items = new List<Item>() | ||||||
|  |             { | ||||||
|  |                 new Item { Id = Guid.NewGuid().ToString(), Text = "First item", Description="This is an item description." }, | ||||||
|  |                 new Item { Id = Guid.NewGuid().ToString(), Text = "Second item", Description="This is an item description." }, | ||||||
|  |                 new Item { Id = Guid.NewGuid().ToString(), Text = "Third item", Description="This is an item description." }, | ||||||
|  |                 new Item { Id = Guid.NewGuid().ToString(), Text = "Fourth item", Description="This is an item description." }, | ||||||
|  |                 new Item { Id = Guid.NewGuid().ToString(), Text = "Fifth item", Description="This is an item description." }, | ||||||
|  |                 new Item { Id = Guid.NewGuid().ToString(), Text = "Sixth item", Description="This is an item description." } | ||||||
|  |             }; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public async Task<bool> AddItemAsync(Item item) | ||||||
|  |         { | ||||||
|  |             items.Add(item); | ||||||
|  |  | ||||||
|  |             return await Task.FromResult(true); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public async Task<bool> UpdateItemAsync(Item item) | ||||||
|  |         { | ||||||
|  |             var oldItem = items.Where((Item arg) => arg.Id == item.Id).FirstOrDefault(); | ||||||
|  |             items.Remove(oldItem); | ||||||
|  |             items.Add(item); | ||||||
|  |  | ||||||
|  |             return await Task.FromResult(true); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public async Task<bool> DeleteItemAsync(string id) | ||||||
|  |         { | ||||||
|  |             var oldItem = items.Where((Item arg) => arg.Id == id).FirstOrDefault(); | ||||||
|  |             items.Remove(oldItem); | ||||||
|  |  | ||||||
|  |             return await Task.FromResult(true); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public async Task<Item> GetItemAsync(string id) | ||||||
|  |         { | ||||||
|  |             return await Task.FromResult(items.FirstOrDefault(s => s.Id == id)); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public async Task<IEnumerable<Item>> GetItemsAsync(bool forceRefresh = false) | ||||||
|  |         { | ||||||
|  |             return await Task.FromResult(items); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										18
									
								
								Gallery.Share/ViewModels/AboutViewModel.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,18 @@ | |||||||
|  | using System; | ||||||
|  | using System.Windows.Input; | ||||||
|  | using Xamarin.Essentials; | ||||||
|  | using Xamarin.Forms; | ||||||
|  |  | ||||||
|  | namespace Gallery.ViewModels | ||||||
|  | { | ||||||
|  |     public class AboutViewModel : BaseViewModel | ||||||
|  |     { | ||||||
|  |         public AboutViewModel() | ||||||
|  |         { | ||||||
|  |             Title = "About"; | ||||||
|  |             OpenWebCommand = new Command(async () => await Browser.OpenAsync("https://aka.ms/xamarin-quickstart")); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public ICommand OpenWebCommand { get; } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										56
									
								
								Gallery.Share/ViewModels/BaseViewModel.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,56 @@ | |||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.ComponentModel; | ||||||
|  | using System.Runtime.CompilerServices; | ||||||
|  |  | ||||||
|  | using Xamarin.Forms; | ||||||
|  |  | ||||||
|  | using Gallery.Models; | ||||||
|  | using Gallery.Services; | ||||||
|  |  | ||||||
|  | namespace Gallery.ViewModels | ||||||
|  | { | ||||||
|  |     public class BaseViewModel : INotifyPropertyChanged | ||||||
|  |     { | ||||||
|  |         public IDataStore<Item> DataStore => DependencyService.Get<IDataStore<Item>>(); | ||||||
|  |  | ||||||
|  |         bool isBusy = false; | ||||||
|  |         public bool IsBusy | ||||||
|  |         { | ||||||
|  |             get { return isBusy; } | ||||||
|  |             set { SetProperty(ref isBusy, value); } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         string title = string.Empty; | ||||||
|  |         public string Title | ||||||
|  |         { | ||||||
|  |             get { return title; } | ||||||
|  |             set { SetProperty(ref title, value); } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         protected bool SetProperty<T>(ref T backingStore, T value, | ||||||
|  |             [CallerMemberName] string propertyName = "", | ||||||
|  |             Action onChanged = null) | ||||||
|  |         { | ||||||
|  |             if (EqualityComparer<T>.Default.Equals(backingStore, value)) | ||||||
|  |                 return false; | ||||||
|  |  | ||||||
|  |             backingStore = value; | ||||||
|  |             onChanged?.Invoke(); | ||||||
|  |             OnPropertyChanged(propertyName); | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         #region INotifyPropertyChanged | ||||||
|  |         public event PropertyChangedEventHandler PropertyChanged; | ||||||
|  |         protected void OnPropertyChanged([CallerMemberName] string propertyName = "") | ||||||
|  |         { | ||||||
|  |             var changed = PropertyChanged; | ||||||
|  |             if (changed == null) | ||||||
|  |                 return; | ||||||
|  |  | ||||||
|  |             changed.Invoke(this, new PropertyChangedEventArgs(propertyName)); | ||||||
|  |         } | ||||||
|  |         #endregion | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										57
									
								
								Gallery.Share/ViewModels/ItemDetailViewModel.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,57 @@ | |||||||
|  | using System; | ||||||
|  | using System.Diagnostics; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using Gallery.Models; | ||||||
|  | using Xamarin.Forms; | ||||||
|  |  | ||||||
|  | namespace Gallery.ViewModels | ||||||
|  | { | ||||||
|  |     [QueryProperty(nameof(ItemId), nameof(ItemId))] | ||||||
|  |     public class ItemDetailViewModel : BaseViewModel | ||||||
|  |     { | ||||||
|  |         private string itemId; | ||||||
|  |         private string text; | ||||||
|  |         private string description; | ||||||
|  |         public string Id { get; set; } | ||||||
|  |  | ||||||
|  |         public string Text | ||||||
|  |         { | ||||||
|  |             get => text; | ||||||
|  |             set => SetProperty(ref text, value); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public string Description | ||||||
|  |         { | ||||||
|  |             get => description; | ||||||
|  |             set => SetProperty(ref description, value); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public string ItemId | ||||||
|  |         { | ||||||
|  |             get | ||||||
|  |             { | ||||||
|  |                 return itemId; | ||||||
|  |             } | ||||||
|  |             set | ||||||
|  |             { | ||||||
|  |                 itemId = value; | ||||||
|  |                 LoadItemId(value); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public async void LoadItemId(string itemId) | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 var item = await DataStore.GetItemAsync(itemId); | ||||||
|  |                 Id = item.Id; | ||||||
|  |                 Text = item.Text; | ||||||
|  |                 Description = item.Description; | ||||||
|  |             } | ||||||
|  |             catch (Exception) | ||||||
|  |             { | ||||||
|  |                 Debug.WriteLine("Failed to Load Item"); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										86
									
								
								Gallery.Share/ViewModels/ItemsViewModel.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,86 @@ | |||||||
|  | using System; | ||||||
|  | using System.Collections.ObjectModel; | ||||||
|  | using System.Diagnostics; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  |  | ||||||
|  | using Xamarin.Forms; | ||||||
|  |  | ||||||
|  | using Gallery.Models; | ||||||
|  | using Gallery.Views; | ||||||
|  |  | ||||||
|  | namespace Gallery.ViewModels | ||||||
|  | { | ||||||
|  |     public class ItemsViewModel : BaseViewModel | ||||||
|  |     { | ||||||
|  |         private Item _selectedItem; | ||||||
|  |  | ||||||
|  |         public ObservableCollection<Item> Items { get; } | ||||||
|  |         public Command LoadItemsCommand { get; } | ||||||
|  |         public Command AddItemCommand { get; } | ||||||
|  |         public Command<Item> ItemTapped { get; } | ||||||
|  |  | ||||||
|  |         public ItemsViewModel() | ||||||
|  |         { | ||||||
|  |             Title = "Browse"; | ||||||
|  |             Items = new ObservableCollection<Item>(); | ||||||
|  |             LoadItemsCommand = new Command(async () => await ExecuteLoadItemsCommand()); | ||||||
|  |  | ||||||
|  |             ItemTapped = new Command<Item>(OnItemSelected); | ||||||
|  |  | ||||||
|  |             AddItemCommand = new Command(OnAddItem); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         async Task ExecuteLoadItemsCommand() | ||||||
|  |         { | ||||||
|  |             IsBusy = true; | ||||||
|  |  | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 Items.Clear(); | ||||||
|  |                 var items = await DataStore.GetItemsAsync(true); | ||||||
|  |                 foreach (var item in items) | ||||||
|  |                 { | ||||||
|  |                     Items.Add(item); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             catch (Exception ex) | ||||||
|  |             { | ||||||
|  |                 Debug.WriteLine(ex); | ||||||
|  |             } | ||||||
|  |             finally | ||||||
|  |             { | ||||||
|  |                 IsBusy = false; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public void OnAppearing() | ||||||
|  |         { | ||||||
|  |             IsBusy = true; | ||||||
|  |             SelectedItem = null; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public Item SelectedItem | ||||||
|  |         { | ||||||
|  |             get => _selectedItem; | ||||||
|  |             set | ||||||
|  |             { | ||||||
|  |                 SetProperty(ref _selectedItem, value); | ||||||
|  |                 OnItemSelected(value); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         private async void OnAddItem(object obj) | ||||||
|  |         { | ||||||
|  |             await Shell.Current.GoToAsync(nameof(NewItemPage)); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         async void OnItemSelected(Item item) | ||||||
|  |         { | ||||||
|  |             if (item == null) | ||||||
|  |                 return; | ||||||
|  |  | ||||||
|  |             // This will push the ItemDetailPage onto the navigation stack | ||||||
|  |             await Shell.Current.GoToAsync($"{nameof(ItemDetailPage)}?{nameof(ItemDetailViewModel.ItemId)}={item.Id}"); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										24
									
								
								Gallery.Share/ViewModels/LoginViewModel.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,24 @@ | |||||||
|  | using Gallery.Views; | ||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.Text; | ||||||
|  | using Xamarin.Forms; | ||||||
|  |  | ||||||
|  | namespace Gallery.ViewModels | ||||||
|  | { | ||||||
|  |     public class LoginViewModel : BaseViewModel | ||||||
|  |     { | ||||||
|  |         public Command LoginCommand { get; } | ||||||
|  |  | ||||||
|  |         public LoginViewModel() | ||||||
|  |         { | ||||||
|  |             LoginCommand = new Command(OnLoginClicked); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         private async void OnLoginClicked(object obj) | ||||||
|  |         { | ||||||
|  |             // Prefixing with `//` switches to a different navigation stack instead of pushing to the active one | ||||||
|  |             await Shell.Current.GoToAsync($"//{nameof(AboutPage)}"); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										65
									
								
								Gallery.Share/ViewModels/NewItemViewModel.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,65 @@ | |||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.Text; | ||||||
|  | using System.Windows.Input; | ||||||
|  | using Gallery.Models; | ||||||
|  | using Xamarin.Forms; | ||||||
|  |  | ||||||
|  | namespace Gallery.ViewModels | ||||||
|  | { | ||||||
|  |     public class NewItemViewModel : BaseViewModel | ||||||
|  |     { | ||||||
|  |         private string text; | ||||||
|  |         private string description; | ||||||
|  |  | ||||||
|  |         public NewItemViewModel() | ||||||
|  |         { | ||||||
|  |             SaveCommand = new Command(OnSave, ValidateSave); | ||||||
|  |             CancelCommand = new Command(OnCancel); | ||||||
|  |             this.PropertyChanged += | ||||||
|  |                 (_, __) => SaveCommand.ChangeCanExecute(); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         private bool ValidateSave() | ||||||
|  |         { | ||||||
|  |             return !String.IsNullOrWhiteSpace(text) | ||||||
|  |                 && !String.IsNullOrWhiteSpace(description); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public string Text | ||||||
|  |         { | ||||||
|  |             get => text; | ||||||
|  |             set => SetProperty(ref text, value); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public string Description | ||||||
|  |         { | ||||||
|  |             get => description; | ||||||
|  |             set => SetProperty(ref description, value); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public Command SaveCommand { get; } | ||||||
|  |         public Command CancelCommand { get; } | ||||||
|  |  | ||||||
|  |         private async void OnCancel() | ||||||
|  |         { | ||||||
|  |             // This will pop the current page off the navigation stack | ||||||
|  |             await Shell.Current.GoToAsync(".."); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         private async void OnSave() | ||||||
|  |         { | ||||||
|  |             Item newItem = new Item() | ||||||
|  |             { | ||||||
|  |                 Id = Guid.NewGuid().ToString(), | ||||||
|  |                 Text = Text, | ||||||
|  |                 Description = Description | ||||||
|  |             }; | ||||||
|  |  | ||||||
|  |             await DataStore.AddItemAsync(newItem); | ||||||
|  |  | ||||||
|  |             // This will pop the current page off the navigation stack | ||||||
|  |             await Shell.Current.GoToAsync(".."); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										52
									
								
								Gallery.Share/Views/AboutPage.xaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,52 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8" ?> | ||||||
|  | <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" | ||||||
|  |              xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" | ||||||
|  |              x:Class="Gallery.Views.AboutPage" | ||||||
|  |              xmlns:vm="clr-namespace:Gallery.ViewModels" | ||||||
|  |              Title="{Binding Title}"> | ||||||
|  |      | ||||||
|  |     <ContentPage.BindingContext> | ||||||
|  |         <vm:AboutViewModel /> | ||||||
|  |     </ContentPage.BindingContext> | ||||||
|  |      | ||||||
|  |     <ContentPage.Resources> | ||||||
|  |         <ResourceDictionary> | ||||||
|  |             <Color x:Key="Accent">#96d1ff</Color> | ||||||
|  |         </ResourceDictionary> | ||||||
|  |     </ContentPage.Resources> | ||||||
|  |  | ||||||
|  |     <Grid> | ||||||
|  |         <Grid.RowDefinitions> | ||||||
|  |             <RowDefinition Height="Auto" /> | ||||||
|  |             <RowDefinition Height="*" /> | ||||||
|  |         </Grid.RowDefinitions> | ||||||
|  |         <StackLayout BackgroundColor="{StaticResource Accent}" VerticalOptions="FillAndExpand" HorizontalOptions="Fill"> | ||||||
|  |             <StackLayout Orientation="Horizontal" HorizontalOptions="Center" VerticalOptions="Center"> | ||||||
|  |                 <ContentView Padding="0,40,0,40" VerticalOptions="FillAndExpand"> | ||||||
|  |                     <Image Source="xamarin_logo.png" VerticalOptions="Center" HeightRequest="64" /> | ||||||
|  |                 </ContentView> | ||||||
|  |             </StackLayout> | ||||||
|  |         </StackLayout> | ||||||
|  |         <ScrollView Grid.Row="1"> | ||||||
|  |             <StackLayout Orientation="Vertical" Padding="30,24,30,24" Spacing="10"> | ||||||
|  |                 <Label Text="Start developing now" FontSize="Title"/> | ||||||
|  |                 <Label Text="Make changes to your XAML file and save to see your UI update in the running app with XAML Hot Reload. Give it a try!" FontSize="16" Padding="0,0,0,0"/> | ||||||
|  |                 <Label FontSize="16" Padding="0,24,0,0"> | ||||||
|  |                     <Label.FormattedText> | ||||||
|  |                         <FormattedString> | ||||||
|  |                             <FormattedString.Spans> | ||||||
|  |                                 <Span Text="Learn more at "/> | ||||||
|  |                                 <Span Text="https://aka.ms/xamarin-quickstart" FontAttributes="Bold"/> | ||||||
|  |                             </FormattedString.Spans> | ||||||
|  |                         </FormattedString> | ||||||
|  |                     </Label.FormattedText> | ||||||
|  |                 </Label> | ||||||
|  |                 <Button Margin="0,10,0,0" Text="Learn more" | ||||||
|  |                         Command="{Binding OpenWebCommand}" | ||||||
|  |                         BackgroundColor="{StaticResource Primary}" | ||||||
|  |                         TextColor="White" /> | ||||||
|  |             </StackLayout> | ||||||
|  |         </ScrollView> | ||||||
|  |     </Grid> | ||||||
|  |  | ||||||
|  | </ContentPage> | ||||||
							
								
								
									
										15
									
								
								Gallery.Share/Views/AboutPage.xaml.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,15 @@ | |||||||
|  | using System; | ||||||
|  | using System.ComponentModel; | ||||||
|  | using Xamarin.Forms; | ||||||
|  | using Xamarin.Forms.Xaml; | ||||||
|  |  | ||||||
|  | namespace Gallery.Views | ||||||
|  | { | ||||||
|  |     public partial class AboutPage : ContentPage | ||||||
|  |     { | ||||||
|  |         public AboutPage() | ||||||
|  |         { | ||||||
|  |             InitializeComponent(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										14
									
								
								Gallery.Share/Views/ItemDetailPage.xaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,14 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8" ?> | ||||||
|  | <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" | ||||||
|  |              xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" | ||||||
|  |              x:Class="Gallery.Views.ItemDetailPage" | ||||||
|  |              Title="{Binding Title}"> | ||||||
|  |  | ||||||
|  |     <StackLayout Spacing="20" Padding="15"> | ||||||
|  |         <Label Text="Text:" FontSize="Medium" /> | ||||||
|  |         <Label Text="{Binding Text}" FontSize="Small"/> | ||||||
|  |         <Label Text="Description:" FontSize="Medium" /> | ||||||
|  |         <Label Text="{Binding Description}" FontSize="Small"/> | ||||||
|  |     </StackLayout> | ||||||
|  |      | ||||||
|  | </ContentPage> | ||||||
							
								
								
									
										15
									
								
								Gallery.Share/Views/ItemDetailPage.xaml.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,15 @@ | |||||||
|  | using System.ComponentModel; | ||||||
|  | using Xamarin.Forms; | ||||||
|  | using Gallery.ViewModels; | ||||||
|  |  | ||||||
|  | namespace Gallery.Views | ||||||
|  | { | ||||||
|  |     public partial class ItemDetailPage : ContentPage | ||||||
|  |     { | ||||||
|  |         public ItemDetailPage() | ||||||
|  |         { | ||||||
|  |             InitializeComponent(); | ||||||
|  |             BindingContext = new ItemDetailViewModel(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										44
									
								
								Gallery.Share/Views/ItemsPage.xaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,44 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8" ?> | ||||||
|  | <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" | ||||||
|  |              xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" | ||||||
|  |              x:Class="Gallery.Views.ItemsPage" | ||||||
|  |              Title="{Binding Title}" | ||||||
|  |              xmlns:local="clr-namespace:Gallery.ViewModels"   | ||||||
|  |              xmlns:model="clr-namespace:Gallery.Models"   | ||||||
|  |              x:Name="BrowseItemsPage"> | ||||||
|  |  | ||||||
|  |     <ContentPage.ToolbarItems> | ||||||
|  |         <ToolbarItem Text="Add" Command="{Binding AddItemCommand}" /> | ||||||
|  |     </ContentPage.ToolbarItems> | ||||||
|  |     <!-- | ||||||
|  |       x:DataType enables compiled bindings for better performance and compile time validation of binding expressions. | ||||||
|  |       https://docs.microsoft.com/xamarin/xamarin-forms/app-fundamentals/data-binding/compiled-bindings | ||||||
|  |     --> | ||||||
|  |     <RefreshView x:DataType="local:ItemsViewModel" Command="{Binding LoadItemsCommand}" IsRefreshing="{Binding IsBusy, Mode=TwoWay}"> | ||||||
|  |         <CollectionView x:Name="ItemsListView" | ||||||
|  |                 ItemsSource="{Binding Items}" | ||||||
|  |                 SelectionMode="None"> | ||||||
|  |             <CollectionView.ItemTemplate> | ||||||
|  |                 <DataTemplate> | ||||||
|  |                     <StackLayout Padding="10" x:DataType="model:Item"> | ||||||
|  |                         <Label Text="{Binding Text}"  | ||||||
|  |                             LineBreakMode="NoWrap"  | ||||||
|  |                             Style="{DynamicResource ListItemTextStyle}"  | ||||||
|  |                             FontSize="16" /> | ||||||
|  |                         <Label Text="{Binding Description}"  | ||||||
|  |                             LineBreakMode="NoWrap" | ||||||
|  |                             Style="{DynamicResource ListItemDetailTextStyle}" | ||||||
|  |                             FontSize="13" /> | ||||||
|  |                         <StackLayout.GestureRecognizers> | ||||||
|  |                             <TapGestureRecognizer  | ||||||
|  |                                 NumberOfTapsRequired="1" | ||||||
|  |                                 Command="{Binding Source={RelativeSource AncestorType={x:Type local:ItemsViewModel}}, Path=ItemTapped}"		 | ||||||
|  |                                 CommandParameter="{Binding .}"> | ||||||
|  |                             </TapGestureRecognizer> | ||||||
|  |                         </StackLayout.GestureRecognizers> | ||||||
|  |                     </StackLayout> | ||||||
|  |                 </DataTemplate> | ||||||
|  |             </CollectionView.ItemTemplate> | ||||||
|  |         </CollectionView> | ||||||
|  |     </RefreshView> | ||||||
|  | </ContentPage> | ||||||
							
								
								
									
										33
									
								
								Gallery.Share/Views/ItemsPage.xaml.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,33 @@ | |||||||
|  | using System; | ||||||
|  | using System.ComponentModel; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.Linq; | ||||||
|  | using System.Text; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using Xamarin.Forms; | ||||||
|  | using Xamarin.Forms.Xaml; | ||||||
|  |  | ||||||
|  | using Gallery.Models; | ||||||
|  | using Gallery.Views; | ||||||
|  | using Gallery.ViewModels; | ||||||
|  |  | ||||||
|  | namespace Gallery.Views | ||||||
|  | { | ||||||
|  |     public partial class ItemsPage : ContentPage | ||||||
|  |     { | ||||||
|  |         ItemsViewModel _viewModel; | ||||||
|  |  | ||||||
|  |         public ItemsPage() | ||||||
|  |         { | ||||||
|  |             InitializeComponent(); | ||||||
|  |  | ||||||
|  |             BindingContext = _viewModel = new ItemsViewModel(); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         protected override void OnAppearing() | ||||||
|  |         { | ||||||
|  |             base.OnAppearing(); | ||||||
|  |             _viewModel.OnAppearing(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										14
									
								
								Gallery.Share/Views/LoginPage.xaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,14 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8" ?> | ||||||
|  | <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" | ||||||
|  |              xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" | ||||||
|  |              xmlns:d="http://xamarin.com/schemas/2014/forms/design" | ||||||
|  |              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" | ||||||
|  |              mc:Ignorable="d" | ||||||
|  |              x:Class="Gallery.Views.LoginPage" | ||||||
|  |              Shell.NavBarIsVisible="False"> | ||||||
|  |     <ContentPage.Content> | ||||||
|  |         <StackLayout Padding="10,0,10,0" VerticalOptions="Center"> | ||||||
|  |             <Button VerticalOptions="Center" Text="Login" Command="{Binding LoginCommand}"/> | ||||||
|  |         </StackLayout> | ||||||
|  |     </ContentPage.Content> | ||||||
|  | </ContentPage> | ||||||
							
								
								
									
										21
									
								
								Gallery.Share/Views/LoginPage.xaml.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,21 @@ | |||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.Linq; | ||||||
|  | using System.Text; | ||||||
|  | using System.Threading.Tasks; | ||||||
|  | using Gallery.ViewModels; | ||||||
|  | using Xamarin.Forms; | ||||||
|  | using Xamarin.Forms.Xaml; | ||||||
|  |  | ||||||
|  | namespace Gallery.Views | ||||||
|  | { | ||||||
|  |     [XamlCompilation(XamlCompilationOptions.Compile)] | ||||||
|  |     public partial class LoginPage : ContentPage | ||||||
|  |     { | ||||||
|  |         public LoginPage() | ||||||
|  |         { | ||||||
|  |             InitializeComponent(); | ||||||
|  |             this.BindingContext = new LoginViewModel(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										22
									
								
								Gallery.Share/Views/NewItemPage.xaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,22 @@ | |||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" | ||||||
|  |              xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" | ||||||
|  |              x:Class="Gallery.Views.NewItemPage" | ||||||
|  |              Shell.PresentationMode="ModalAnimated" | ||||||
|  |              Title="New Item" | ||||||
|  |              xmlns:ios="clr-namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core" | ||||||
|  |              ios:Page.UseSafeArea="true"> | ||||||
|  |     <ContentPage.Content> | ||||||
|  |         <StackLayout Spacing="3" Padding="15"> | ||||||
|  |             <Label Text="Text" FontSize="Medium" /> | ||||||
|  |             <Entry Text="{Binding Text, Mode=TwoWay}" FontSize="Medium" /> | ||||||
|  |             <Label Text="Description" FontSize="Medium" /> | ||||||
|  |             <Editor Text="{Binding Description, Mode=TwoWay}" AutoSize="TextChanges" FontSize="Medium" Margin="0" /> | ||||||
|  |             <StackLayout Orientation="Horizontal"> | ||||||
|  |                 <Button Text="Cancel" Command="{Binding CancelCommand}" HorizontalOptions="FillAndExpand"></Button> | ||||||
|  |                 <Button Text="Save" Command="{Binding SaveCommand}" HorizontalOptions="FillAndExpand"></Button> | ||||||
|  |             </StackLayout> | ||||||
|  |         </StackLayout> | ||||||
|  |     </ContentPage.Content> | ||||||
|  |      | ||||||
|  | </ContentPage> | ||||||
							
								
								
									
										22
									
								
								Gallery.Share/Views/NewItemPage.xaml.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,22 @@ | |||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.ComponentModel; | ||||||
|  | using Xamarin.Forms; | ||||||
|  | using Xamarin.Forms.Xaml; | ||||||
|  |  | ||||||
|  | using Gallery.Models; | ||||||
|  | using Gallery.ViewModels; | ||||||
|  |  | ||||||
|  | namespace Gallery.Views | ||||||
|  | { | ||||||
|  |     public partial class NewItemPage : ContentPage | ||||||
|  |     { | ||||||
|  |         public Item Item { get; set; } | ||||||
|  |  | ||||||
|  |         public NewItemPage() | ||||||
|  |         { | ||||||
|  |             InitializeComponent(); | ||||||
|  |             BindingContext = new NewItemViewModel(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										95
									
								
								Gallery.Util/Converter.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,95 @@ | |||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using System.Text.Json; | ||||||
|  | using System.Text.Json.Serialization; | ||||||
|  | using Gallery.Util.Model; | ||||||
|  |  | ||||||
|  | namespace Gallery.Util | ||||||
|  | { | ||||||
|  |     public class GalleryItemConverter : JsonConverter<GalleryItem> | ||||||
|  |     { | ||||||
|  |         public override GalleryItem Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) | ||||||
|  |         { | ||||||
|  |             reader.Read(); | ||||||
|  |             if (reader.TokenType != JsonTokenType.StartObject) | ||||||
|  |             { | ||||||
|  |                 return null; | ||||||
|  |             } | ||||||
|  |             var item = new GalleryItem(); | ||||||
|  |             while (reader.Read()) | ||||||
|  |             { | ||||||
|  |                 if (reader.TokenType == JsonTokenType.PropertyName) | ||||||
|  |                 { | ||||||
|  |                     var name = reader.GetString(); | ||||||
|  |                     reader.Read(); | ||||||
|  |                     switch (name) | ||||||
|  |                     { | ||||||
|  |                         case nameof(GalleryItem.Id): item.Id = reader.GetInt64(); break; | ||||||
|  |                         case nameof(GalleryItem.Tags): | ||||||
|  |                             if (reader.TokenType == JsonTokenType.StartArray) | ||||||
|  |                             { | ||||||
|  |                                 var tags = new List<string>(); | ||||||
|  |                                 while (reader.Read()) | ||||||
|  |                                 { | ||||||
|  |                                     if (reader.TokenType == JsonTokenType.EndArray) | ||||||
|  |                                     { | ||||||
|  |                                         break; | ||||||
|  |                                     } | ||||||
|  |                                     if (reader.TokenType == JsonTokenType.String) | ||||||
|  |                                     { | ||||||
|  |                                         tags.Add(reader.GetString()); | ||||||
|  |                                     } | ||||||
|  |                                 } | ||||||
|  |                                 item.Tags = tags.ToArray(); | ||||||
|  |                             } | ||||||
|  |                             break; | ||||||
|  |                         case nameof(GalleryItem.CreatedTime): item.CreatedTime = reader.GetDateTime(); break; | ||||||
|  |                         case nameof(GalleryItem.UpdatedTime): item.UpdatedTime = reader.GetDateTime(); break; | ||||||
|  |                         case nameof(GalleryItem.UserId): item.UserId = reader.GetString(); break; | ||||||
|  |                         case nameof(GalleryItem.UserName): item.UserName = reader.GetString(); break; | ||||||
|  |                         case nameof(GalleryItem.Source): item.Source = reader.GetString(); break; | ||||||
|  |                         case nameof(GalleryItem.PreviewUrl): item.PreviewUrl = reader.GetString(); break; | ||||||
|  |                         case nameof(GalleryItem.RawUrl): item.RawUrl = reader.GetString(); break; | ||||||
|  |                         case nameof(GalleryItem.Width): item.Width = reader.GetInt32(); break; | ||||||
|  |                         case nameof(GalleryItem.Height): item.Height = reader.GetInt32(); break; | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             return item; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public override void Write(Utf8JsonWriter writer, GalleryItem value, JsonSerializerOptions options) | ||||||
|  |         { | ||||||
|  |             if (value == null) | ||||||
|  |             { | ||||||
|  |                 writer.WriteNullValue(); | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             writer.WriteStartObject(); | ||||||
|  |  | ||||||
|  |             writer.WriteNumber(nameof(GalleryItem.Id), value.Id); | ||||||
|  |             if (value.Tags != null) | ||||||
|  |             { | ||||||
|  |                 writer.WritePropertyName(nameof(GalleryItem.Tags)); | ||||||
|  |                 writer.WriteStartArray(); | ||||||
|  |                 for (var i = 0; i < value.Tags.Length; i++) | ||||||
|  |                 { | ||||||
|  |                     writer.WriteStringValue(value.Tags[i]); | ||||||
|  |                 } | ||||||
|  |                 writer.WriteEndArray(); | ||||||
|  |             } | ||||||
|  |             writer.WriteString(nameof(GalleryItem.CreatedTime), value.CreatedTime); | ||||||
|  |             writer.WriteString(nameof(GalleryItem.UpdatedTime), value.UpdatedTime); | ||||||
|  |             writer.WriteString(nameof(GalleryItem.UserId), value.UserId); | ||||||
|  |             writer.WriteString(nameof(GalleryItem.UserName), value.UserName); | ||||||
|  |             writer.WriteString(nameof(GalleryItem.Source), value.Source); | ||||||
|  |             writer.WriteString(nameof(GalleryItem.PreviewUrl), value.PreviewUrl); | ||||||
|  |             writer.WriteString(nameof(GalleryItem.RawUrl), value.RawUrl); | ||||||
|  |             writer.WriteNumber(nameof(GalleryItem.Width), value.Width); | ||||||
|  |             writer.WriteNumber(nameof(GalleryItem.Height), value.Height); | ||||||
|  |  | ||||||
|  |             writer.WriteEndObject(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										23
									
								
								Gallery.Util/Gallery.Util.csproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,23 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <TargetFramework>netstandard2.1</TargetFramework> | ||||||
|  |     <SignAssembly>true</SignAssembly> | ||||||
|  |     <AssemblyOriginatorKeyFile>..\Ref\Tsanie.snk</AssemblyOriginatorKeyFile> | ||||||
|  |   </PropertyGroup> | ||||||
|  |  | ||||||
|  |   <ItemGroup> | ||||||
|  |     <None Remove="System.Text.Json" /> | ||||||
|  |     <None Remove="Xamarin.Forms" /> | ||||||
|  |     <None Remove="Interface\" /> | ||||||
|  |     <None Remove="Model\" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |   <ItemGroup> | ||||||
|  |     <PackageReference Include="System.Text.Json" Version="5.0.2" /> | ||||||
|  |     <PackageReference Include="Xamarin.Forms" Version="5.0.0.2083" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |   <ItemGroup> | ||||||
|  |     <Folder Include="Interface\" /> | ||||||
|  |     <Folder Include="Model\" /> | ||||||
|  |   </ItemGroup> | ||||||
|  | </Project> | ||||||
							
								
								
									
										11
									
								
								Gallery.Util/Interface/IGallerySource.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,11 @@ | |||||||
|  | using Gallery.Util.Model; | ||||||
|  |  | ||||||
|  | namespace Gallery.Util.Interface | ||||||
|  | { | ||||||
|  |     public interface IGallerySource | ||||||
|  |     { | ||||||
|  |         string GetCookie(); | ||||||
|  |  | ||||||
|  |         GalleryItem[] GetRecentItems(int page); | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										79
									
								
								Gallery.Util/Model/GalleryItem.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,79 @@ | |||||||
|  | using System; | ||||||
|  | using System.Text.Json.Serialization; | ||||||
|  | using Xamarin.Forms; | ||||||
|  |  | ||||||
|  | namespace Gallery.Util.Model | ||||||
|  | { | ||||||
|  |     [JsonConverter(typeof(GalleryItemConverter))] | ||||||
|  |     public class GalleryItem : BindableObject | ||||||
|  |     { | ||||||
|  |         const double PREVIEW_WIDTH = 200.0; | ||||||
|  |  | ||||||
|  |         public static readonly BindableProperty TagDescriptionProperty = BindableProperty.Create(nameof(TagDescription), typeof(string), typeof(GalleryItem)); | ||||||
|  |         public static readonly BindableProperty PreviewImageProperty = BindableProperty.Create(nameof(PreviewImage), typeof(ImageSource), typeof(GalleryItem)); | ||||||
|  |         public static readonly BindableProperty UserNameProperty = BindableProperty.Create(nameof(UserName), typeof(string), typeof(GalleryItem)); | ||||||
|  |         public static readonly BindableProperty CreatedTimeProperty = BindableProperty.Create(nameof(CreatedTime), typeof(DateTime), typeof(GalleryItem)); | ||||||
|  |         public static readonly BindableProperty UpdatedTimeProperty = BindableProperty.Create(nameof(UpdatedTime), typeof(DateTime), typeof(GalleryItem)); | ||||||
|  |         public static readonly BindableProperty ImageHeightProperty = BindableProperty.Create(nameof(ImageHeight), typeof(GridLength), typeof(GalleryItem), GridLength.Auto); | ||||||
|  |  | ||||||
|  |         [JsonIgnore] | ||||||
|  |         public string TagDescription { get; set; } | ||||||
|  |         [JsonIgnore] | ||||||
|  |         public ImageSource PreviewImage { get; set; } | ||||||
|  |         [JsonIgnore] | ||||||
|  |         public GridLength ImageHeight { get; set; } | ||||||
|  |  | ||||||
|  |         public long Id { get; internal set; } | ||||||
|  |         private string[] tags; | ||||||
|  |         public string[] Tags | ||||||
|  |         { | ||||||
|  |             get => tags; | ||||||
|  |             set | ||||||
|  |             { | ||||||
|  |                 tags = value; | ||||||
|  |                 if (value != null) | ||||||
|  |                 { | ||||||
|  |                     TagDescription = string.Join(' ', tags); | ||||||
|  |                 } | ||||||
|  |                 else | ||||||
|  |                 { | ||||||
|  |                     TagDescription = null; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         public DateTime CreatedTime { get; set; } | ||||||
|  |         public DateTime UpdatedTime { get; set; } | ||||||
|  |         public string UserId { get; set; } | ||||||
|  |         public string UserName { get; set; } | ||||||
|  |         public string Source { get; set; } | ||||||
|  |         public string PreviewUrl { get; set; } | ||||||
|  |         public string RawUrl { get; set; } | ||||||
|  |  | ||||||
|  |         private int width; | ||||||
|  |         private int height; | ||||||
|  |         public int Width | ||||||
|  |         { | ||||||
|  |             get => width; | ||||||
|  |             set | ||||||
|  |             { | ||||||
|  |                 width = value; | ||||||
|  |                 if (width > 0 && height > 0) | ||||||
|  |                 { | ||||||
|  |                     ImageHeight = new GridLength(PREVIEW_WIDTH * height / width); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         public int Height | ||||||
|  |         { | ||||||
|  |             get => height; | ||||||
|  |             set | ||||||
|  |             { | ||||||
|  |                 height = value; | ||||||
|  |                 if (width > 0 && height > 0) | ||||||
|  |                 { | ||||||
|  |                     ImageHeight = new GridLength(PREVIEW_WIDTH * height / width); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										27
									
								
								Gallery.iOS/AppDelegate.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,27 @@ | |||||||
|  | using Foundation; | ||||||
|  | using UIKit; | ||||||
|  |  | ||||||
|  | namespace Gallery.iOS | ||||||
|  | { | ||||||
|  |     // The UIApplicationDelegate for the application. This class is responsible for launching the  | ||||||
|  |     // User Interface of the application, as well as listening (and optionally responding) to  | ||||||
|  |     // application events from iOS. | ||||||
|  |     [Register("AppDelegate")] | ||||||
|  |     public partial class AppDelegate : Xamarin.Forms.Platform.iOS.FormsApplicationDelegate | ||||||
|  |     { | ||||||
|  |         // | ||||||
|  |         // This method is invoked when the application has loaded and is ready to run. In this  | ||||||
|  |         // method you should instantiate the window, load the UI into it and then make the window | ||||||
|  |         // visible. | ||||||
|  |         // | ||||||
|  |         // You have 17 seconds to return from this method, or iOS will terminate your application. | ||||||
|  |         // | ||||||
|  |         public override bool FinishedLaunching(UIApplication app, NSDictionary options) | ||||||
|  |         { | ||||||
|  |             Xamarin.Forms.Forms.Init(); | ||||||
|  |             LoadApplication(new App()); | ||||||
|  |  | ||||||
|  |             return base.FinishedLaunching(app, options); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										117
									
								
								Gallery.iOS/Assets.xcassets/AppIcon.appiconset/Contents.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,117 @@ | |||||||
|  | { | ||||||
|  |   "images": [ | ||||||
|  |     { | ||||||
|  |       "scale": "2x", | ||||||
|  |       "size": "20x20", | ||||||
|  |       "idiom": "iphone", | ||||||
|  |       "filename": "Icon40.png" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "scale": "3x", | ||||||
|  |       "size": "20x20", | ||||||
|  |       "idiom": "iphone", | ||||||
|  |       "filename": "Icon60.png" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "scale": "2x", | ||||||
|  |       "size": "29x29", | ||||||
|  |       "idiom": "iphone", | ||||||
|  |       "filename": "Icon58.png" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "scale": "3x", | ||||||
|  |       "size": "29x29", | ||||||
|  |       "idiom": "iphone", | ||||||
|  |       "filename": "Icon87.png" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "scale": "2x", | ||||||
|  |       "size": "40x40", | ||||||
|  |       "idiom": "iphone", | ||||||
|  |       "filename": "Icon80.png" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "scale": "3x", | ||||||
|  |       "size": "40x40", | ||||||
|  |       "idiom": "iphone", | ||||||
|  |       "filename": "Icon120.png" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "scale": "2x", | ||||||
|  |       "size": "60x60", | ||||||
|  |       "idiom": "iphone", | ||||||
|  |       "filename": "Icon120.png" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "scale": "3x", | ||||||
|  |       "size": "60x60", | ||||||
|  |       "idiom": "iphone", | ||||||
|  |       "filename": "Icon180.png" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "scale": "1x", | ||||||
|  |       "size": "20x20", | ||||||
|  |       "idiom": "ipad", | ||||||
|  |       "filename": "Icon20.png" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "scale": "2x", | ||||||
|  |       "size": "20x20", | ||||||
|  |       "idiom": "ipad", | ||||||
|  |       "filename": "Icon40.png" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "scale": "1x", | ||||||
|  |       "size": "29x29", | ||||||
|  |       "idiom": "ipad", | ||||||
|  |       "filename": "Icon29.png" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "scale": "2x", | ||||||
|  |       "size": "29x29", | ||||||
|  |       "idiom": "ipad", | ||||||
|  |       "filename": "Icon58.png" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "scale": "1x", | ||||||
|  |       "size": "40x40", | ||||||
|  |       "idiom": "ipad", | ||||||
|  |       "filename": "Icon40.png" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "scale": "2x", | ||||||
|  |       "size": "40x40", | ||||||
|  |       "idiom": "ipad", | ||||||
|  |       "filename": "Icon80.png" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "scale": "1x", | ||||||
|  |       "size": "76x76", | ||||||
|  |       "idiom": "ipad", | ||||||
|  |       "filename": "Icon76.png" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "scale": "2x", | ||||||
|  |       "size": "76x76", | ||||||
|  |       "idiom": "ipad", | ||||||
|  |       "filename": "Icon152.png" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "scale": "2x", | ||||||
|  |       "size": "83.5x83.5", | ||||||
|  |       "idiom": "ipad", | ||||||
|  |       "filename": "Icon167.png" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "scale": "1x", | ||||||
|  |       "size": "1024x1024", | ||||||
|  |       "idiom": "ios-marketing", | ||||||
|  |       "filename": "Icon1024.png" | ||||||
|  |     } | ||||||
|  |   ], | ||||||
|  |   "properties": {}, | ||||||
|  |   "info": { | ||||||
|  |     "version": 1, | ||||||
|  |     "author": "xcode" | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										
											BIN
										
									
								
								Gallery.iOS/Assets.xcassets/AppIcon.appiconset/Icon1024.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 69 KiB | 
							
								
								
									
										
											BIN
										
									
								
								Gallery.iOS/Assets.xcassets/AppIcon.appiconset/Icon120.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.7 KiB | 
							
								
								
									
										
											BIN
										
									
								
								Gallery.iOS/Assets.xcassets/AppIcon.appiconset/Icon152.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 4.6 KiB | 
							
								
								
									
										
											BIN
										
									
								
								Gallery.iOS/Assets.xcassets/AppIcon.appiconset/Icon167.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 4.6 KiB | 
							
								
								
									
										
											BIN
										
									
								
								Gallery.iOS/Assets.xcassets/AppIcon.appiconset/Icon180.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 5.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								Gallery.iOS/Assets.xcassets/AppIcon.appiconset/Icon20.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.3 KiB | 
							
								
								
									
										
											BIN
										
									
								
								Gallery.iOS/Assets.xcassets/AppIcon.appiconset/Icon29.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 845 B | 
							
								
								
									
										
											BIN
										
									
								
								Gallery.iOS/Assets.xcassets/AppIcon.appiconset/Icon40.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								Gallery.iOS/Assets.xcassets/AppIcon.appiconset/Icon58.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.7 KiB | 
							
								
								
									
										
											BIN
										
									
								
								Gallery.iOS/Assets.xcassets/AppIcon.appiconset/Icon60.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.5 KiB | 
							
								
								
									
										
											BIN
										
									
								
								Gallery.iOS/Assets.xcassets/AppIcon.appiconset/Icon76.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.3 KiB | 
							
								
								
									
										
											BIN
										
									
								
								Gallery.iOS/Assets.xcassets/AppIcon.appiconset/Icon80.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.4 KiB | 
							
								
								
									
										
											BIN
										
									
								
								Gallery.iOS/Assets.xcassets/AppIcon.appiconset/Icon87.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.7 KiB | 
							
								
								
									
										7
									
								
								Gallery.iOS/Entitlements.plist
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,7 @@ | |||||||
|  | <?xml version="1.0" encoding="UTF-8" ?> | ||||||
|  | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||||||
|  | <plist version="1.0"> | ||||||
|  | <dict> | ||||||
|  | </dict> | ||||||
|  | </plist> | ||||||
|  |  | ||||||
							
								
								
									
										157
									
								
								Gallery.iOS/Gallery.iOS.csproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,157 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||||||
|  |   <PropertyGroup> | ||||||
|  |     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> | ||||||
|  |     <Platform Condition=" '$(Platform)' == '' ">iPhoneSimulator</Platform> | ||||||
|  |     <ProductVersion>8.0.30703</ProductVersion> | ||||||
|  |     <SchemaVersion>2.0</SchemaVersion> | ||||||
|  |     <ProjectGuid>{94E59D2C-9083-4BAB-9567-A0B0C4B4266D}</ProjectGuid> | ||||||
|  |     <ProjectTypeGuids>{FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> | ||||||
|  |     <TemplateGuid>{89a4fe7c-635d-49c9-8d8c-5cd363c0d68d}</TemplateGuid> | ||||||
|  |     <OutputType>Exe</OutputType> | ||||||
|  |     <RootNamespace>Gallery.iOS</RootNamespace> | ||||||
|  |     <IPhoneResourcePrefix>Resources</IPhoneResourcePrefix> | ||||||
|  |     <AssemblyName>Gallery.iOS</AssemblyName> | ||||||
|  |     <MtouchEnableSGenConc>true</MtouchEnableSGenConc> | ||||||
|  |     <MtouchHttpClientHandler>NSUrlSessionHandler</MtouchHttpClientHandler> | ||||||
|  |     <ProvisioningType>automatic</ProvisioningType> | ||||||
|  |     <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|iPhoneSimulator' "> | ||||||
|  |     <DebugSymbols>true</DebugSymbols> | ||||||
|  |     <DebugType>portable</DebugType> | ||||||
|  |     <Optimize>false</Optimize> | ||||||
|  |     <OutputPath>bin\iPhoneSimulator\Debug</OutputPath> | ||||||
|  |     <DefineConstants>DEBUG</DefineConstants> | ||||||
|  |     <ErrorReport>prompt</ErrorReport> | ||||||
|  |     <WarningLevel>4</WarningLevel> | ||||||
|  |     <MtouchArch>x86_64</MtouchArch> | ||||||
|  |     <MtouchLink>None</MtouchLink> | ||||||
|  |     <MtouchDebug>true</MtouchDebug> | ||||||
|  |     <CodesignProvision>Gallery.Dev</CodesignProvision> | ||||||
|  |     <CodesignKey>Apple Development: Li Chen (5559SN7Z38)</CodesignKey> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhoneSimulator' "> | ||||||
|  |     <DebugType>none</DebugType> | ||||||
|  |     <Optimize>true</Optimize> | ||||||
|  |     <OutputPath>bin\iPhoneSimulator\Release</OutputPath> | ||||||
|  |     <ErrorReport>prompt</ErrorReport> | ||||||
|  |     <WarningLevel>4</WarningLevel> | ||||||
|  |     <MtouchLink>None</MtouchLink> | ||||||
|  |     <MtouchArch>x86_64</MtouchArch> | ||||||
|  |     <CodesignProvision>Gallery.Ad-Hoc</CodesignProvision> | ||||||
|  |     <CodesignKey>Apple Distribution: Li Chen (7HSM5CKPJ2)</CodesignKey> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|iPhone' "> | ||||||
|  |     <DebugSymbols>true</DebugSymbols> | ||||||
|  |     <DebugType>portable</DebugType> | ||||||
|  |     <Optimize>false</Optimize> | ||||||
|  |     <OutputPath>bin\iPhone\Debug</OutputPath> | ||||||
|  |     <DefineConstants>DEBUG</DefineConstants> | ||||||
|  |     <ErrorReport>prompt</ErrorReport> | ||||||
|  |     <WarningLevel>4</WarningLevel> | ||||||
|  |     <MtouchArch>ARM64</MtouchArch> | ||||||
|  |     <CodesignKey>Apple Development: Li Chen (5559SN7Z38)</CodesignKey> | ||||||
|  |     <MtouchDebug>true</MtouchDebug> | ||||||
|  |     <CodesignEntitlements>Entitlements.plist</CodesignEntitlements> | ||||||
|  |     <MtouchLink>None</MtouchLink> | ||||||
|  |     <MtouchInterpreter>-all</MtouchInterpreter> | ||||||
|  |     <CodesignProvision>Gallery.Dev</CodesignProvision> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhone' "> | ||||||
|  |     <DebugType>none</DebugType> | ||||||
|  |     <Optimize>true</Optimize> | ||||||
|  |     <OutputPath>bin\iPhone\Release</OutputPath> | ||||||
|  |     <ErrorReport>prompt</ErrorReport> | ||||||
|  |     <WarningLevel>4</WarningLevel> | ||||||
|  |     <MtouchArch>ARM64</MtouchArch> | ||||||
|  |     <CodesignKey>Apple Distribution: Li Chen (7HSM5CKPJ2)</CodesignKey> | ||||||
|  |     <CodesignEntitlements>Entitlements.plist</CodesignEntitlements> | ||||||
|  |     <CodesignProvision>Gallery.Ad-Hoc</CodesignProvision> | ||||||
|  |     <MtouchLink>SdkOnly</MtouchLink> | ||||||
|  |   </PropertyGroup> | ||||||
|  |   <ItemGroup> | ||||||
|  |     <Compile Include="Main.cs" /> | ||||||
|  |     <Compile Include="AppDelegate.cs" /> | ||||||
|  |     <None Include="Entitlements.plist" /> | ||||||
|  |     <None Include="Info.plist" /> | ||||||
|  |     <Compile Include="Properties\AssemblyInfo.cs" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ImageAsset Include="Assets.xcassets\AppIcon.appiconset\Contents.json"> | ||||||
|  |       <Visible>false</Visible> | ||||||
|  |     </ImageAsset> | ||||||
|  |     <ImageAsset Include="Assets.xcassets\AppIcon.appiconset\Icon1024.png"> | ||||||
|  |       <Visible>false</Visible> | ||||||
|  |     </ImageAsset> | ||||||
|  |     <ImageAsset Include="Assets.xcassets\AppIcon.appiconset\Icon180.png"> | ||||||
|  |       <Visible>false</Visible> | ||||||
|  |     </ImageAsset> | ||||||
|  |     <ImageAsset Include="Assets.xcassets\AppIcon.appiconset\Icon167.png"> | ||||||
|  |       <Visible>false</Visible> | ||||||
|  |     </ImageAsset> | ||||||
|  |     <ImageAsset Include="Assets.xcassets\AppIcon.appiconset\Icon152.png"> | ||||||
|  |       <Visible>false</Visible> | ||||||
|  |     </ImageAsset> | ||||||
|  |     <ImageAsset Include="Assets.xcassets\AppIcon.appiconset\Icon120.png"> | ||||||
|  |       <Visible>false</Visible> | ||||||
|  |     </ImageAsset> | ||||||
|  |     <ImageAsset Include="Assets.xcassets\AppIcon.appiconset\Icon87.png"> | ||||||
|  |       <Visible>false</Visible> | ||||||
|  |     </ImageAsset> | ||||||
|  |     <ImageAsset Include="Assets.xcassets\AppIcon.appiconset\Icon80.png"> | ||||||
|  |       <Visible>false</Visible> | ||||||
|  |     </ImageAsset> | ||||||
|  |     <ImageAsset Include="Assets.xcassets\AppIcon.appiconset\Icon76.png"> | ||||||
|  |       <Visible>false</Visible> | ||||||
|  |     </ImageAsset> | ||||||
|  |     <ImageAsset Include="Assets.xcassets\AppIcon.appiconset\Icon60.png"> | ||||||
|  |       <Visible>false</Visible> | ||||||
|  |     </ImageAsset> | ||||||
|  |     <ImageAsset Include="Assets.xcassets\AppIcon.appiconset\Icon58.png"> | ||||||
|  |       <Visible>false</Visible> | ||||||
|  |     </ImageAsset> | ||||||
|  |     <ImageAsset Include="Assets.xcassets\AppIcon.appiconset\Icon40.png"> | ||||||
|  |       <Visible>false</Visible> | ||||||
|  |     </ImageAsset> | ||||||
|  |     <ImageAsset Include="Assets.xcassets\AppIcon.appiconset\Icon29.png"> | ||||||
|  |       <Visible>false</Visible> | ||||||
|  |     </ImageAsset> | ||||||
|  |     <ImageAsset Include="Assets.xcassets\AppIcon.appiconset\Icon20.png"> | ||||||
|  |       <Visible>false</Visible> | ||||||
|  |     </ImageAsset> | ||||||
|  |     <BundleResource Include="Resources\icon_about.png" /> | ||||||
|  |     <BundleResource Include="Resources\icon_about%402x.png" /> | ||||||
|  |     <BundleResource Include="Resources\icon_about%403x.png" /> | ||||||
|  |     <BundleResource Include="Resources\icon_feed.png" /> | ||||||
|  |     <BundleResource Include="Resources\icon_feed%402x.png" /> | ||||||
|  |     <BundleResource Include="Resources\icon_feed%403x.png" /> | ||||||
|  |     <BundleResource Include="Resources\xamarin_logo.png" /> | ||||||
|  |     <BundleResource Include="Resources\xamarin_logo%402x.png" /> | ||||||
|  |     <BundleResource Include="Resources\xamarin_logo%403x.png" /> | ||||||
|  |     <InterfaceDefinition Include="Resources\LaunchScreen.storyboard" /> | ||||||
|  |     <BundleResource Include="Resources\fa-light-300.ttf" /> | ||||||
|  |     <BundleResource Include="Resources\fa-regular-400.ttf" /> | ||||||
|  |     <BundleResource Include="Resources\fa-solid-900.ttf" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |   <ItemGroup> | ||||||
|  |     <Reference Include="System" /> | ||||||
|  |     <Reference Include="System.Xml" /> | ||||||
|  |     <Reference Include="System.Core" /> | ||||||
|  |     <Reference Include="Xamarin.iOS" /> | ||||||
|  |     <Reference Include="System.Numerics" /> | ||||||
|  |     <Reference Include="System.Numerics.Vectors" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |   <ItemGroup> | ||||||
|  |     <PackageReference Include="Xamarin.Forms" Version="5.0.0.2083" /> | ||||||
|  |     <PackageReference Include="Xamarin.Essentials" Version="1.7.0" /> | ||||||
|  |   </ItemGroup> | ||||||
|  |   <ItemGroup> | ||||||
|  |     <ProjectReference Include="..\Gallery.Util\Gallery.Util.csproj"> | ||||||
|  |       <Project>{222C22EC-3A47-4CF5-B9FB-CA28DE9F4BC8}</Project> | ||||||
|  |       <Name>Gallery.Util</Name> | ||||||
|  |     </ProjectReference> | ||||||
|  |   </ItemGroup> | ||||||
|  |   <Import Project="..\Gallery.Share\Gallery.Share.projitems" Label="Shared" Condition="Exists('..\Gallery.Share\Gallery.Share.projitems')" /> | ||||||
|  |   <Import Project="$(MSBuildExtensionsPath)\Xamarin\iOS\Xamarin.iOS.CSharp.targets" /> | ||||||
|  | </Project> | ||||||
							
								
								
									
										52
									
								
								Gallery.iOS/Info.plist
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,52 @@ | |||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||||||
|  | <plist version="1.0"> | ||||||
|  | <dict> | ||||||
|  | 	<key>UIDeviceFamily</key> | ||||||
|  | 	<array> | ||||||
|  | 		<integer>1</integer> | ||||||
|  | 		<integer>2</integer> | ||||||
|  | 	</array> | ||||||
|  | 	<key>UISupportedInterfaceOrientations</key> | ||||||
|  | 	<array> | ||||||
|  | 		<string>UIInterfaceOrientationPortrait</string> | ||||||
|  | 		<string>UIInterfaceOrientationLandscapeLeft</string> | ||||||
|  | 		<string>UIInterfaceOrientationLandscapeRight</string> | ||||||
|  | 	</array> | ||||||
|  | 	<key>UISupportedInterfaceOrientations~ipad</key> | ||||||
|  | 	<array> | ||||||
|  | 		<string>UIInterfaceOrientationPortrait</string> | ||||||
|  | 		<string>UIInterfaceOrientationPortraitUpsideDown</string> | ||||||
|  | 		<string>UIInterfaceOrientationLandscapeLeft</string> | ||||||
|  | 		<string>UIInterfaceOrientationLandscapeRight</string> | ||||||
|  | 	</array> | ||||||
|  | 	<key>MinimumOSVersion</key> | ||||||
|  | 	<string>13.0</string> | ||||||
|  | 	<key>CFBundleDisplayName</key> | ||||||
|  | 	<string>Gallery</string> | ||||||
|  | 	<key>CFBundleIdentifier</key> | ||||||
|  | 	<string>org.tsanie.gallery</string> | ||||||
|  | 	<key>UILaunchStoryboardName</key> | ||||||
|  | 	<string>LaunchScreen</string> | ||||||
|  | 	<key>CFBundleName</key> | ||||||
|  | 	<string>Gallery</string> | ||||||
|  | 	<key>XSAppIconAssets</key> | ||||||
|  | 	<string>Assets.xcassets/AppIcon.appiconset</string> | ||||||
|  | 	<key>CFBundleShortVersionString</key> | ||||||
|  | 	<string>1.0.805</string> | ||||||
|  | 	<key>CFBundleVersion</key> | ||||||
|  | 	<string>1</string> | ||||||
|  | 	<key>UIAppFonts</key> | ||||||
|  | 	<array> | ||||||
|  | 		<string>fa-light-300.ttf</string> | ||||||
|  | 		<string>fa-regular-400.ttf</string> | ||||||
|  | 		<string>fa-solid-900.ttf</string> | ||||||
|  | 	</array> | ||||||
|  | 	<key>UIViewControllerBasedStatusBarAppearance</key> | ||||||
|  | 	<true/> | ||||||
|  | 	<key>UIStatusBarStyle</key> | ||||||
|  | 	<string>UIStatusBarStyleDefault</string> | ||||||
|  | 	<key>CFBundleDevelopmentRegion</key> | ||||||
|  | 	<string>China</string> | ||||||
|  | </dict> | ||||||
|  | </plist> | ||||||
							
								
								
									
										15
									
								
								Gallery.iOS/Main.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,15 @@ | |||||||
|  | using UIKit; | ||||||
|  |  | ||||||
|  | namespace Gallery.iOS | ||||||
|  | { | ||||||
|  |     public class Application | ||||||
|  |     { | ||||||
|  |         // This is the main entry point of the application. | ||||||
|  |         static void Main(string[] args) | ||||||
|  |         { | ||||||
|  |             // if you want to use a different Application Delegate class from "AppDelegate" | ||||||
|  |             // you can specify it here. | ||||||
|  |             UIApplication.Main(args, null, "AppDelegate"); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										38
									
								
								Gallery.iOS/Properties/AssemblyInfo.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,38 @@ | |||||||
|  | using System.Reflection; | ||||||
|  | using System.Runtime.InteropServices; | ||||||
|  | using Xamarin.Forms.Xaml; | ||||||
|  |  | ||||||
|  | // General Information about an assembly is controlled through the following  | ||||||
|  | // set of attributes. Change these attribute values to modify the information | ||||||
|  | // associated with an assembly. | ||||||
|  | [assembly: AssemblyTitle("Gallery.iOS")] | ||||||
|  | [assembly: AssemblyDescription("")] | ||||||
|  | [assembly: AssemblyConfiguration("")] | ||||||
|  | [assembly: AssemblyCompany("")] | ||||||
|  | [assembly: AssemblyProduct("Gallery.iOS")] | ||||||
|  | [assembly: AssemblyCopyright("Copyright © Tsanie.Org 2021")] | ||||||
|  | [assembly: AssemblyTrademark("")] | ||||||
|  | [assembly: AssemblyCulture("")] | ||||||
|  |  | ||||||
|  | // Setting ComVisible to false makes the types in this assembly not visible  | ||||||
|  | // to COM components.  If you need to access a type in this assembly from  | ||||||
|  | // COM, set the ComVisible attribute to true on that type. | ||||||
|  | [assembly: ComVisible(false)] | ||||||
|  |  | ||||||
|  | // The following GUID is for the ID of the typelib if this project is exposed to COM | ||||||
|  | [assembly: Guid("72bdc44f-c588-44f3-b6df-9aace7daafdd")] | ||||||
|  |  | ||||||
|  | // Version information for an assembly consists of the following four values: | ||||||
|  | // | ||||||
|  | //      Major Version | ||||||
|  | //      Minor Version  | ||||||
|  | //      Build Number | ||||||
|  | //      Revision | ||||||
|  | // | ||||||
|  | // You can specify all the values or you can default the Build and Revision Numbers  | ||||||
|  | // by using the '*' as shown below: | ||||||
|  | // [assembly: AssemblyVersion("1.0.*")] | ||||||
|  | [assembly: AssemblyVersion("1.0.0.0")] | ||||||
|  | [assembly: AssemblyFileVersion("1.0.0.0")] | ||||||
|  |  | ||||||
|  | [assembly: XamlCompilation(XamlCompilationOptions.Compile)] | ||||||
							
								
								
									
										
											BIN
										
									
								
								Gallery.iOS/Resources/Default-568h@2x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 8.7 KiB | 
							
								
								
									
										
											BIN
										
									
								
								Gallery.iOS/Resources/Default-Portrait.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 10 KiB | 
							
								
								
									
										
											BIN
										
									
								
								Gallery.iOS/Resources/Default-Portrait@2x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 34 KiB | 
							
								
								
									
										
											BIN
										
									
								
								Gallery.iOS/Resources/Default.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 7.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								Gallery.iOS/Resources/Default@2x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 8.2 KiB | 
							
								
								
									
										39
									
								
								Gallery.iOS/Resources/LaunchScreen.storyboard
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,39 @@ | |||||||
|  | <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||||
|  | <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6245" systemVersion="13F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="X5k-f2-b5h"> | ||||||
|  |     <dependencies> | ||||||
|  |         <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6238"/> | ||||||
|  |     </dependencies> | ||||||
|  |     <scenes> | ||||||
|  |         <!--View Controller--> | ||||||
|  |         <scene sceneID="gAE-YM-kbH"> | ||||||
|  |             <objects> | ||||||
|  |                 <viewController id="X5k-f2-b5h" sceneMemberID="viewController"> | ||||||
|  |                     <layoutGuides> | ||||||
|  |                         <viewControllerLayoutGuide type="top" id="Y8P-hJ-Z43"/> | ||||||
|  |                         <viewControllerLayoutGuide type="bottom" id="9ZL-r4-8FZ"/> | ||||||
|  |                     </layoutGuides> | ||||||
|  |                     <view key="view" contentMode="scaleToFill" id="yd7-JS-zBw"> | ||||||
|  |                         <rect key="frame" x="0.0" y="0.0" width="600" height="600"/> | ||||||
|  |                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> | ||||||
|  |                         <subviews> | ||||||
|  |                             <imageView userInteractionEnabled="NO" contentMode="scaleToFill" misplaced="YES" image="Icon-60.png" translatesAutoresizingMaskIntoConstraints="NO" id="23"> | ||||||
|  |                                 <rect key="frame" x="270" y="270" width="60" height="60"/> | ||||||
|  |                                 <rect key="contentStretch" x="0.0" y="0.0" width="0.0" height="0.0"/> | ||||||
|  |                             </imageView> | ||||||
|  |                         </subviews> | ||||||
|  |                         <color key="backgroundColor" red="0.20392156862745098" green="0.59607843137254901" blue="0.85882352941176465" alpha="1" colorSpace="calibratedRGB"/> | ||||||
|  |                         <constraints> | ||||||
|  |                             <constraint firstItem="23" firstAttribute="centerY" secondItem="yd7-JS-zBw" secondAttribute="centerY" priority="1" id="39"/> | ||||||
|  |                             <constraint firstItem="23" firstAttribute="centerX" secondItem="yd7-JS-zBw" secondAttribute="centerX" priority="1" id="41"/> | ||||||
|  |                         </constraints> | ||||||
|  |                     </view> | ||||||
|  |                 </viewController> | ||||||
|  |                 <placeholder placeholderIdentifier="IBFirstResponder" id="XAI-xm-WK6" userLabel="First Responder" sceneMemberID="firstResponder"/> | ||||||
|  |             </objects> | ||||||
|  |             <point key="canvasLocation" x="349" y="339"/> | ||||||
|  |         </scene> | ||||||
|  |     </scenes> | ||||||
|  |     <resources> | ||||||
|  |         <image name="Icon-60.png" width="180" height="180"/> | ||||||
|  |     </resources> | ||||||
|  | </document> | ||||||
							
								
								
									
										
											BIN
										
									
								
								Gallery.iOS/Resources/fa-light-300.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								Gallery.iOS/Resources/fa-regular-400.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								Gallery.iOS/Resources/fa-solid-900.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								Gallery.iOS/Resources/icon_about.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 518 B | 
							
								
								
									
										
											BIN
										
									
								
								Gallery.iOS/Resources/icon_about@2x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								Gallery.iOS/Resources/icon_about@3x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.0 KiB | 
							
								
								
									
										
											BIN
										
									
								
								Gallery.iOS/Resources/icon_feed.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 415 B | 
							
								
								
									
										
											BIN
										
									
								
								Gallery.iOS/Resources/icon_feed@2x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 863 B | 
							
								
								
									
										
											BIN
										
									
								
								Gallery.iOS/Resources/icon_feed@3x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.4 KiB | 
							
								
								
									
										
											BIN
										
									
								
								Gallery.iOS/Resources/xamarin_logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 4.2 KiB | 
							
								
								
									
										
											BIN
										
									
								
								Gallery.iOS/Resources/xamarin_logo@2x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 9.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								Gallery.iOS/Resources/xamarin_logo@3x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 21 KiB | 
							
								
								
									
										53
									
								
								Gallery.sln
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,53 @@ | |||||||
|  |  | ||||||
|  | Microsoft Visual Studio Solution File, Format Version 12.00 | ||||||
|  | # Visual Studio Version 16 | ||||||
|  | VisualStudioVersion = 16.0.810.6 | ||||||
|  | MinimumVisualStudioVersion = 10.0.40219.1 | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gallery.iOS", "Gallery.iOS\Gallery.iOS.csproj", "{94E59D2C-9083-4BAB-9567-A0B0C4B4266D}" | ||||||
|  | EndProject | ||||||
|  | Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Gallery.Share", "Gallery.Share\Gallery.Share.shproj", "{E72B5C40-090B-4A1C-9170-BD33C14A9A91}" | ||||||
|  | EndProject | ||||||
|  | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gallery.Util", "Gallery.Util\Gallery.Util.csproj", "{222C22EC-3A47-4CF5-B9FB-CA28DE9F4BC8}" | ||||||
|  | EndProject | ||||||
|  | Global | ||||||
|  | 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||||
|  | 		Debug|iPhoneSimulator = Debug|iPhoneSimulator | ||||||
|  | 		Release|iPhoneSimulator = Release|iPhoneSimulator | ||||||
|  | 		Debug|iPhone = Debug|iPhone | ||||||
|  | 		Release|iPhone = Release|iPhone | ||||||
|  | 		Debug|Any CPU = Debug|Any CPU | ||||||
|  | 		Release|Any CPU = Release|Any CPU | ||||||
|  | 	EndGlobalSection | ||||||
|  | 	GlobalSection(ProjectConfigurationPlatforms) = postSolution | ||||||
|  | 		{94E59D2C-9083-4BAB-9567-A0B0C4B4266D}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator | ||||||
|  | 		{94E59D2C-9083-4BAB-9567-A0B0C4B4266D}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator | ||||||
|  | 		{94E59D2C-9083-4BAB-9567-A0B0C4B4266D}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator | ||||||
|  | 		{94E59D2C-9083-4BAB-9567-A0B0C4B4266D}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator | ||||||
|  | 		{94E59D2C-9083-4BAB-9567-A0B0C4B4266D}.Debug|iPhone.ActiveCfg = Debug|iPhone | ||||||
|  | 		{94E59D2C-9083-4BAB-9567-A0B0C4B4266D}.Debug|iPhone.Build.0 = Debug|iPhone | ||||||
|  | 		{94E59D2C-9083-4BAB-9567-A0B0C4B4266D}.Release|iPhone.ActiveCfg = Release|iPhone | ||||||
|  | 		{94E59D2C-9083-4BAB-9567-A0B0C4B4266D}.Release|iPhone.Build.0 = Release|iPhone | ||||||
|  | 		{94E59D2C-9083-4BAB-9567-A0B0C4B4266D}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator | ||||||
|  | 		{94E59D2C-9083-4BAB-9567-A0B0C4B4266D}.Debug|Any CPU.Build.0 = Debug|iPhoneSimulator | ||||||
|  | 		{94E59D2C-9083-4BAB-9567-A0B0C4B4266D}.Release|Any CPU.ActiveCfg = Release|iPhoneSimulator | ||||||
|  | 		{94E59D2C-9083-4BAB-9567-A0B0C4B4266D}.Release|Any CPU.Build.0 = Release|iPhoneSimulator | ||||||
|  | 		{222C22EC-3A47-4CF5-B9FB-CA28DE9F4BC8}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{222C22EC-3A47-4CF5-B9FB-CA28DE9F4BC8}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU | ||||||
|  | 		{222C22EC-3A47-4CF5-B9FB-CA28DE9F4BC8}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU | ||||||
|  | 		{222C22EC-3A47-4CF5-B9FB-CA28DE9F4BC8}.Release|iPhoneSimulator.Build.0 = Release|Any CPU | ||||||
|  | 		{222C22EC-3A47-4CF5-B9FB-CA28DE9F4BC8}.Debug|iPhone.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{222C22EC-3A47-4CF5-B9FB-CA28DE9F4BC8}.Debug|iPhone.Build.0 = Debug|Any CPU | ||||||
|  | 		{222C22EC-3A47-4CF5-B9FB-CA28DE9F4BC8}.Release|iPhone.ActiveCfg = Release|Any CPU | ||||||
|  | 		{222C22EC-3A47-4CF5-B9FB-CA28DE9F4BC8}.Release|iPhone.Build.0 = Release|Any CPU | ||||||
|  | 		{222C22EC-3A47-4CF5-B9FB-CA28DE9F4BC8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
|  | 		{222C22EC-3A47-4CF5-B9FB-CA28DE9F4BC8}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
|  | 		{222C22EC-3A47-4CF5-B9FB-CA28DE9F4BC8}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
|  | 		{222C22EC-3A47-4CF5-B9FB-CA28DE9F4BC8}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
|  | 	EndGlobalSection | ||||||
|  | 	GlobalSection(SolutionProperties) = preSolution | ||||||
|  | 		HideSolutionNode = FALSE | ||||||
|  | 	EndGlobalSection | ||||||
|  | 	GlobalSection(ExtensibilityGlobals) = postSolution | ||||||
|  | 		SolutionGuid = {A969B750-3E3E-4815-B336-02B32908D0C4} | ||||||
|  | 	EndGlobalSection | ||||||
|  | EndGlobal | ||||||