├── .gitignore ├── LICENSE ├── README.md └── WordPressXF ├── WordPressXF.sln └── WordPressXF ├── WordPressXF.Android ├── Assets │ └── AboutAssets.txt ├── MainActivity.cs ├── Properties │ ├── AndroidManifest.xml │ └── AssemblyInfo.cs ├── Resources │ ├── AboutResources.txt │ ├── Resource.Designer.cs │ ├── drawable-hdpi │ │ └── icon.png │ ├── drawable-xhdpi │ │ └── icon.png │ ├── drawable-xxhdpi │ │ └── icon.png │ ├── drawable │ │ └── icon.png │ ├── layout │ │ ├── Tabbar.axml │ │ └── Toolbar.axml │ └── values │ │ └── styles.xml ├── WordPressXF.Android.csproj ├── app.config └── packages.config ├── WordPressXF.UWP ├── App.xaml ├── App.xaml.cs ├── Assets │ ├── LockScreenLogo.scale-200.png │ ├── SplashScreen.scale-200.png │ ├── Square150x150Logo.scale-200.png │ ├── Square44x44Logo.scale-200.png │ ├── Square44x44Logo.targetsize-24_altform-unplated.png │ ├── StoreLogo.png │ └── Wide310x150Logo.scale-200.png ├── MainPage.xaml ├── MainPage.xaml.cs ├── Package.appxmanifest ├── Properties │ ├── AssemblyInfo.cs │ └── Default.rd.xml └── WordPressXF.UWP.csproj ├── WordPressXF.iOS ├── AppDelegate.cs ├── Entitlements.plist ├── Info.plist ├── Main.cs ├── Properties │ └── AssemblyInfo.cs ├── Resources │ ├── Default-568h@2x.png │ ├── Default-Portrait.png │ ├── Default-Portrait@2x.png │ ├── Default.png │ ├── Default@2x.png │ ├── Icon-60@2x.png │ ├── Icon-60@3x.png │ ├── Icon-76.png │ ├── Icon-76@2x.png │ ├── Icon-Small-40.png │ ├── Icon-Small-40@2x.png │ ├── Icon-Small-40@3x.png │ ├── Icon-Small.png │ ├── Icon-Small@2x.png │ ├── Icon-Small@3x.png │ ├── LaunchScreen.storyboard │ ├── comments.png │ ├── comments@2x.png │ ├── comments@3x.png │ ├── hamburger.png │ ├── hamburger@2x.png │ ├── hamburger@3x.png │ ├── post.png │ ├── post@2x.png │ └── post@3x.png ├── WordPressXF.iOS.csproj ├── app.config ├── iTunesArtwork ├── iTunesArtwork@2x └── packages.config └── WordPressXF ├── App.xaml ├── App.xaml.cs ├── Assets ├── menuheader.png └── placeholder.jpg ├── Behaviors ├── BaseBehavior.cs └── EventToCommandBehavior.cs ├── Common ├── AsyncRelayCommand.cs └── AsyncRelayCommandGeneric.cs ├── Controls ├── ExternalWebView.cs └── IncrementalListView.cs ├── Converters ├── CurrentUserToIsVisibleConverter.cs ├── FeaturedImageConverter.cs ├── HtmlConverter.cs ├── HtmlWebviewConverter.cs ├── ImageResourceConverter.cs ├── ImageSourceConverter.cs ├── NullOrEmptyListToIsVisibleConverter.cs └── SelectedItemConverter.cs ├── ExtensionMethods └── EnumerableExtensions.cs ├── Extensions └── TranslateExtension.cs ├── Init └── Bootstrapper.cs ├── Interfaces └── ISupportIncrementalLoading.cs ├── Resources ├── AppResources.Designer.cs └── AppResources.resx ├── Services └── WordpressService.cs ├── Utils ├── HtmlTools.cs └── Statics.cs ├── ViewModels ├── BaseViewModel.cs ├── NewsViewModel.cs └── SettingsViewModel.cs ├── Views ├── AppShell │ ├── AppShellMaster.xaml │ ├── AppShellMaster.xaml.cs │ ├── AppShellMasterViewModel.cs │ ├── AppShellMenuItem.cs │ ├── AppShellPage.xaml │ └── AppShellPage.xaml.cs ├── CommentPage.xaml ├── CommentPage.xaml.cs ├── NewsDetailPage.xaml ├── NewsDetailPage.xaml.cs ├── NewsOverviewPage.xaml ├── NewsOverviewPage.xaml.cs ├── Settings │ ├── LoginPage.xaml │ └── LoginPage.xaml.cs ├── SettingsPage.xaml ├── SettingsPage.xaml.cs ├── SplashScreen.xaml └── SplashScreen.xaml.cs └── WordPressXF.csproj /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 5 | 6 | # User-specific files 7 | *.suo 8 | *.user 9 | *.userosscache 10 | *.sln.docstates 11 | 12 | # User-specific files (MonoDevelop/Xamarin Studio) 13 | *.userprefs 14 | 15 | # Build results 16 | [Dd]ebug/ 17 | [Dd]ebugPublic/ 18 | [Rr]elease/ 19 | [Rr]eleases/ 20 | x64/ 21 | x86/ 22 | bld/ 23 | [Bb]in/ 24 | [Oo]bj/ 25 | [Ll]og/ 26 | 27 | # Visual Studio 2015 cache/options directory 28 | .vs/ 29 | # Uncomment if you have tasks that create the project's static files in wwwroot 30 | #wwwroot/ 31 | 32 | # MSTest test Results 33 | [Tt]est[Rr]esult*/ 34 | [Bb]uild[Ll]og.* 35 | 36 | # NUNIT 37 | *.VisualState.xml 38 | TestResult.xml 39 | 40 | # Build Results of an ATL Project 41 | [Dd]ebugPS/ 42 | [Rr]eleasePS/ 43 | dlldata.c 44 | 45 | # .NET Core 46 | project.lock.json 47 | project.fragment.lock.json 48 | artifacts/ 49 | **/Properties/launchSettings.json 50 | 51 | *_i.c 52 | *_p.c 53 | *_i.h 54 | *.ilk 55 | *.meta 56 | *.obj 57 | *.pch 58 | *.pdb 59 | *.pgc 60 | *.pgd 61 | *.rsp 62 | *.sbr 63 | *.tlb 64 | *.tli 65 | *.tlh 66 | *.tmp 67 | *.tmp_proj 68 | *.log 69 | *.vspscc 70 | *.vssscc 71 | .builds 72 | *.pidb 73 | *.svclog 74 | *.scc 75 | 76 | # Chutzpah Test files 77 | _Chutzpah* 78 | 79 | # Visual C++ cache files 80 | ipch/ 81 | *.aps 82 | *.ncb 83 | *.opendb 84 | *.opensdf 85 | *.sdf 86 | *.cachefile 87 | *.VC.db 88 | *.VC.VC.opendb 89 | 90 | # Visual Studio profiler 91 | *.psess 92 | *.vsp 93 | *.vspx 94 | *.sap 95 | 96 | # TFS 2012 Local Workspace 97 | $tf/ 98 | 99 | # Guidance Automation Toolkit 100 | *.gpState 101 | 102 | # ReSharper is a .NET coding add-in 103 | _ReSharper*/ 104 | *.[Rr]e[Ss]harper 105 | *.DotSettings.user 106 | 107 | # JustCode is a .NET coding add-in 108 | .JustCode 109 | 110 | # TeamCity is a build add-in 111 | _TeamCity* 112 | 113 | # DotCover is a Code Coverage Tool 114 | *.dotCover 115 | 116 | # Visual Studio code coverage results 117 | *.coverage 118 | *.coveragexml 119 | 120 | # NCrunch 121 | _NCrunch_* 122 | .*crunch*.local.xml 123 | nCrunchTemp_* 124 | 125 | # MightyMoose 126 | *.mm.* 127 | AutoTest.Net/ 128 | 129 | # Web workbench (sass) 130 | .sass-cache/ 131 | 132 | # Installshield output folder 133 | [Ee]xpress/ 134 | 135 | # DocProject is a documentation generator add-in 136 | DocProject/buildhelp/ 137 | DocProject/Help/*.HxT 138 | DocProject/Help/*.HxC 139 | DocProject/Help/*.hhc 140 | DocProject/Help/*.hhk 141 | DocProject/Help/*.hhp 142 | DocProject/Help/Html2 143 | DocProject/Help/html 144 | 145 | # Click-Once directory 146 | publish/ 147 | 148 | # Publish Web Output 149 | *.[Pp]ublish.xml 150 | *.azurePubxml 151 | # TODO: Comment the next line if you want to checkin your web deploy settings 152 | # but database connection strings (with potential passwords) will be unencrypted 153 | *.pubxml 154 | *.publishproj 155 | 156 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 157 | # checkin your Azure Web App publish settings, but sensitive information contained 158 | # in these scripts will be unencrypted 159 | PublishScripts/ 160 | 161 | # NuGet Packages 162 | *.nupkg 163 | # The packages folder can be ignored because of Package Restore 164 | **/packages/* 165 | # except build/, which is used as an MSBuild target. 166 | !**/packages/build/ 167 | # Uncomment if necessary however generally it will be regenerated when needed 168 | #!**/packages/repositories.config 169 | # NuGet v3's project.json files produces more ignorable files 170 | *.nuget.props 171 | *.nuget.targets 172 | 173 | # Microsoft Azure Build Output 174 | csx/ 175 | *.build.csdef 176 | 177 | # Microsoft Azure Emulator 178 | ecf/ 179 | rcf/ 180 | 181 | # Windows Store app package directories and files 182 | AppPackages/ 183 | BundleArtifacts/ 184 | Package.StoreAssociation.xml 185 | _pkginfo.txt 186 | 187 | # Visual Studio cache files 188 | # files ending in .cache can be ignored 189 | *.[Cc]ache 190 | # but keep track of directories ending in .cache 191 | !*.[Cc]ache/ 192 | 193 | # Others 194 | ClientBin/ 195 | ~$* 196 | *~ 197 | *.dbmdl 198 | *.dbproj.schemaview 199 | *.jfm 200 | *.pfx 201 | *.publishsettings 202 | orleans.codegen.cs 203 | 204 | # Since there are multiple workflows, uncomment next line to ignore bower_components 205 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 206 | #bower_components/ 207 | 208 | # RIA/Silverlight projects 209 | Generated_Code/ 210 | 211 | # Backup & report files from converting an old project file 212 | # to a newer Visual Studio version. Backup files are not needed, 213 | # because we have git ;-) 214 | _UpgradeReport_Files/ 215 | Backup*/ 216 | UpgradeLog*.XML 217 | UpgradeLog*.htm 218 | 219 | # SQL Server files 220 | *.mdf 221 | *.ldf 222 | *.ndf 223 | 224 | # Business Intelligence projects 225 | *.rdl.data 226 | *.bim.layout 227 | *.bim_*.settings 228 | 229 | # Microsoft Fakes 230 | FakesAssemblies/ 231 | 232 | # GhostDoc plugin setting file 233 | *.GhostDoc.xml 234 | 235 | # Node.js Tools for Visual Studio 236 | .ntvs_analysis.dat 237 | node_modules/ 238 | 239 | # Typescript v1 declaration files 240 | typings/ 241 | 242 | # Visual Studio 6 build log 243 | *.plg 244 | 245 | # Visual Studio 6 workspace options file 246 | *.opt 247 | 248 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 249 | *.vbw 250 | 251 | # Visual Studio LightSwitch build output 252 | **/*.HTMLClient/GeneratedArtifacts 253 | **/*.DesktopClient/GeneratedArtifacts 254 | **/*.DesktopClient/ModelManifest.xml 255 | **/*.Server/GeneratedArtifacts 256 | **/*.Server/ModelManifest.xml 257 | _Pvt_Extensions 258 | 259 | # Paket dependency manager 260 | .paket/paket.exe 261 | paket-files/ 262 | 263 | # FAKE - F# Make 264 | .fake/ 265 | 266 | # JetBrains Rider 267 | .idea/ 268 | *.sln.iml 269 | 270 | # CodeRush 271 | .cr/ 272 | 273 | # Python Tools for Visual Studio (PTVS) 274 | __pycache__/ 275 | *.pyc 276 | 277 | # Cake - Uncomment if you are using it 278 | # tools/** 279 | # !tools/packages.config 280 | 281 | # Telerik's JustMock configuration file 282 | *.jmconfig 283 | 284 | # BizTalk build output 285 | *.btp.cs 286 | *.btm.cs 287 | *.odx.cs 288 | *.xsd.cs 289 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 WordPress.NET 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # HINT 2 | This repository is archived due to the fact that the code wasn't updated for a long time. We've created a new repository on GitHub [wp-net/WordPressXF-V2](https://github.com/wp-net/WordPressXF-V2) which updates the whole logic to the latest `Xamarin.Forms` bits. 3 | 4 | --- 5 | 6 | ## WordPressXF 7 | This is a Xamarin.Forms app/framework (supporting Android, iOS and UWP) designed to turn easily WordPress Blogs / Sites into nice little apps. 8 | 9 | It's built on 10 | * [WordPressPCL (WordPress REST API Wrapper)](https://github.com/ThomasPe/WordPressPCL) 11 | 12 | ### Features 13 | working and planned features for WordPressXF: 14 | - [x] Show posts 15 | - [x] Show comments 16 | - [x] Use SplashScreen 17 | - [ ] Settings page 18 | - [x] Sign In 19 | - [x] Add comment 20 | 21 | ## Quickstart 22 | 23 | ### WordPress Plugins 24 | Since WordPress 4.7 the REST API has been integrated into the core so there's no need for any plugins to get basic functionality. If you want to access protected endpoints, this library supports authentication through JSON Web Tokens (JWT) (plugin required). 25 | 26 | * [WordPress 4.7 or newer](https://wordpress.org/) 27 | * [JWT Authentication for WP REST API](https://wordpress.org/plugins/jwt-authentication-for-wp-rest-api/) 28 | 29 | ### Getting Started 30 | 31 | Just clone or download the repo and open it in Visual Studio. Before you can build you'll need to enter the URL to your WordPress blog/site in the file [WordPressXF/WordPressXF/WordPressXF/Utils/Statics.cs](https://github.com/wp-net/WordPressXF/blob/master/WordPressXF/WordPressXF/WordPressXF/Utils/Statics.cs). And don't forget to add `/wp-json/` at the end. 32 | 33 | ```c# 34 | namespace WordPressXF.Utils 35 | { 36 | public static class Statics 37 | { 38 | public static string WordpressUrl = "http://www.example.com/wp-json/"; 39 | } 40 | } 41 | ``` 42 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 15 4 | VisualStudioVersion = 15.0.27004.2008 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WordPressXF.Android", "WordPressXF\WordPressXF.Android\WordPressXF.Android.csproj", "{7B80DE80-4FC4-407D-803C-9BD53F1C3698}" 7 | EndProject 8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WordPressXF.iOS", "WordPressXF\WordPressXF.iOS\WordPressXF.iOS.csproj", "{3A4A2217-74B3-43D2-9134-CEB14A5C3393}" 9 | EndProject 10 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WordPressXF", "WordPressXF\WordPressXF\WordPressXF.csproj", "{630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}" 11 | EndProject 12 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WordPressXF.UWP", "WordPressXF\WordPressXF.UWP\WordPressXF.UWP.csproj", "{1CA8EF51-4818-4CBF-9F05-A52142E33823}" 13 | EndProject 14 | Global 15 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 16 | Ad-Hoc|Any CPU = Ad-Hoc|Any CPU 17 | Ad-Hoc|ARM = Ad-Hoc|ARM 18 | Ad-Hoc|iPhone = Ad-Hoc|iPhone 19 | Ad-Hoc|iPhoneSimulator = Ad-Hoc|iPhoneSimulator 20 | Ad-Hoc|x64 = Ad-Hoc|x64 21 | Ad-Hoc|x86 = Ad-Hoc|x86 22 | AppStore|Any CPU = AppStore|Any CPU 23 | AppStore|ARM = AppStore|ARM 24 | AppStore|iPhone = AppStore|iPhone 25 | AppStore|iPhoneSimulator = AppStore|iPhoneSimulator 26 | AppStore|x64 = AppStore|x64 27 | AppStore|x86 = AppStore|x86 28 | Debug|Any CPU = Debug|Any CPU 29 | Debug|ARM = Debug|ARM 30 | Debug|iPhone = Debug|iPhone 31 | Debug|iPhoneSimulator = Debug|iPhoneSimulator 32 | Debug|x64 = Debug|x64 33 | Debug|x86 = Debug|x86 34 | Release|Any CPU = Release|Any CPU 35 | Release|ARM = Release|ARM 36 | Release|iPhone = Release|iPhone 37 | Release|iPhoneSimulator = Release|iPhoneSimulator 38 | Release|x64 = Release|x64 39 | Release|x86 = Release|x86 40 | EndGlobalSection 41 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 42 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU 43 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU 44 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Ad-Hoc|Any CPU.Deploy.0 = Release|Any CPU 45 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU 46 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Ad-Hoc|ARM.Build.0 = Release|Any CPU 47 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Ad-Hoc|ARM.Deploy.0 = Release|Any CPU 48 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU 49 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU 50 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Ad-Hoc|iPhone.Deploy.0 = Release|Any CPU 51 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU 52 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU 53 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Release|Any CPU 54 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU 55 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Ad-Hoc|x64.Build.0 = Release|Any CPU 56 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Ad-Hoc|x64.Deploy.0 = Release|Any CPU 57 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU 58 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Ad-Hoc|x86.Build.0 = Release|Any CPU 59 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Ad-Hoc|x86.Deploy.0 = Release|Any CPU 60 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.AppStore|Any CPU.ActiveCfg = Release|Any CPU 61 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.AppStore|Any CPU.Build.0 = Release|Any CPU 62 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.AppStore|Any CPU.Deploy.0 = Release|Any CPU 63 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.AppStore|ARM.ActiveCfg = Release|Any CPU 64 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.AppStore|ARM.Build.0 = Release|Any CPU 65 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.AppStore|ARM.Deploy.0 = Release|Any CPU 66 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.AppStore|iPhone.ActiveCfg = Release|Any CPU 67 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.AppStore|iPhone.Build.0 = Release|Any CPU 68 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.AppStore|iPhone.Deploy.0 = Release|Any CPU 69 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU 70 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU 71 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.AppStore|iPhoneSimulator.Deploy.0 = Release|Any CPU 72 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.AppStore|x64.ActiveCfg = Release|Any CPU 73 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.AppStore|x64.Build.0 = Release|Any CPU 74 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.AppStore|x64.Deploy.0 = Release|Any CPU 75 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.AppStore|x86.ActiveCfg = Release|Any CPU 76 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.AppStore|x86.Build.0 = Release|Any CPU 77 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.AppStore|x86.Deploy.0 = Release|Any CPU 78 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 79 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Debug|Any CPU.Build.0 = Debug|Any CPU 80 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Debug|Any CPU.Deploy.0 = Debug|Any CPU 81 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Debug|ARM.ActiveCfg = Debug|Any CPU 82 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Debug|ARM.Build.0 = Debug|Any CPU 83 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Debug|ARM.Deploy.0 = Debug|Any CPU 84 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Debug|iPhone.ActiveCfg = Debug|Any CPU 85 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Debug|iPhone.Build.0 = Debug|Any CPU 86 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Debug|iPhone.Deploy.0 = Debug|Any CPU 87 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU 88 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU 89 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU 90 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Debug|x64.ActiveCfg = Debug|Any CPU 91 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Debug|x64.Build.0 = Debug|Any CPU 92 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Debug|x64.Deploy.0 = Debug|Any CPU 93 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Debug|x86.ActiveCfg = Debug|Any CPU 94 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Debug|x86.Build.0 = Debug|Any CPU 95 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Debug|x86.Deploy.0 = Debug|Any CPU 96 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Release|Any CPU.ActiveCfg = Release|Any CPU 97 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Release|Any CPU.Build.0 = Release|Any CPU 98 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Release|Any CPU.Deploy.0 = Release|Any CPU 99 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Release|ARM.ActiveCfg = Release|Any CPU 100 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Release|ARM.Build.0 = Release|Any CPU 101 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Release|ARM.Deploy.0 = Release|Any CPU 102 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Release|iPhone.ActiveCfg = Release|Any CPU 103 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Release|iPhone.Build.0 = Release|Any CPU 104 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Release|iPhone.Deploy.0 = Release|Any CPU 105 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU 106 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Release|iPhoneSimulator.Build.0 = Release|Any CPU 107 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU 108 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Release|x64.ActiveCfg = Release|Any CPU 109 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Release|x64.Build.0 = Release|Any CPU 110 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Release|x64.Deploy.0 = Release|Any CPU 111 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Release|x86.ActiveCfg = Release|Any CPU 112 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Release|x86.Build.0 = Release|Any CPU 113 | {7B80DE80-4FC4-407D-803C-9BD53F1C3698}.Release|x86.Deploy.0 = Release|Any CPU 114 | {3A4A2217-74B3-43D2-9134-CEB14A5C3393}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|iPhoneSimulator 115 | {3A4A2217-74B3-43D2-9134-CEB14A5C3393}.Ad-Hoc|ARM.ActiveCfg = Ad-Hoc|iPhone 116 | {3A4A2217-74B3-43D2-9134-CEB14A5C3393}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone 117 | {3A4A2217-74B3-43D2-9134-CEB14A5C3393}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone 118 | {3A4A2217-74B3-43D2-9134-CEB14A5C3393}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator 119 | {3A4A2217-74B3-43D2-9134-CEB14A5C3393}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator 120 | {3A4A2217-74B3-43D2-9134-CEB14A5C3393}.Ad-Hoc|x64.ActiveCfg = Ad-Hoc|iPhone 121 | {3A4A2217-74B3-43D2-9134-CEB14A5C3393}.Ad-Hoc|x86.ActiveCfg = Ad-Hoc|iPhone 122 | {3A4A2217-74B3-43D2-9134-CEB14A5C3393}.AppStore|Any CPU.ActiveCfg = AppStore|iPhoneSimulator 123 | {3A4A2217-74B3-43D2-9134-CEB14A5C3393}.AppStore|ARM.ActiveCfg = AppStore|iPhone 124 | {3A4A2217-74B3-43D2-9134-CEB14A5C3393}.AppStore|iPhone.ActiveCfg = AppStore|iPhone 125 | {3A4A2217-74B3-43D2-9134-CEB14A5C3393}.AppStore|iPhone.Build.0 = AppStore|iPhone 126 | {3A4A2217-74B3-43D2-9134-CEB14A5C3393}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator 127 | {3A4A2217-74B3-43D2-9134-CEB14A5C3393}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator 128 | {3A4A2217-74B3-43D2-9134-CEB14A5C3393}.AppStore|x64.ActiveCfg = AppStore|iPhone 129 | {3A4A2217-74B3-43D2-9134-CEB14A5C3393}.AppStore|x86.ActiveCfg = AppStore|iPhone 130 | {3A4A2217-74B3-43D2-9134-CEB14A5C3393}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator 131 | {3A4A2217-74B3-43D2-9134-CEB14A5C3393}.Debug|ARM.ActiveCfg = Debug|iPhone 132 | {3A4A2217-74B3-43D2-9134-CEB14A5C3393}.Debug|iPhone.ActiveCfg = Debug|iPhone 133 | {3A4A2217-74B3-43D2-9134-CEB14A5C3393}.Debug|iPhone.Build.0 = Debug|iPhone 134 | {3A4A2217-74B3-43D2-9134-CEB14A5C3393}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator 135 | {3A4A2217-74B3-43D2-9134-CEB14A5C3393}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator 136 | {3A4A2217-74B3-43D2-9134-CEB14A5C3393}.Debug|x64.ActiveCfg = Debug|iPhone 137 | {3A4A2217-74B3-43D2-9134-CEB14A5C3393}.Debug|x86.ActiveCfg = Debug|iPhone 138 | {3A4A2217-74B3-43D2-9134-CEB14A5C3393}.Release|Any CPU.ActiveCfg = Release|iPhoneSimulator 139 | {3A4A2217-74B3-43D2-9134-CEB14A5C3393}.Release|ARM.ActiveCfg = Release|iPhone 140 | {3A4A2217-74B3-43D2-9134-CEB14A5C3393}.Release|iPhone.ActiveCfg = Release|iPhone 141 | {3A4A2217-74B3-43D2-9134-CEB14A5C3393}.Release|iPhone.Build.0 = Release|iPhone 142 | {3A4A2217-74B3-43D2-9134-CEB14A5C3393}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator 143 | {3A4A2217-74B3-43D2-9134-CEB14A5C3393}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator 144 | {3A4A2217-74B3-43D2-9134-CEB14A5C3393}.Release|x64.ActiveCfg = Release|iPhone 145 | {3A4A2217-74B3-43D2-9134-CEB14A5C3393}.Release|x86.ActiveCfg = Release|iPhone 146 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU 147 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU 148 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU 149 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU 150 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU 151 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU 152 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU 153 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU 154 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU 155 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Ad-Hoc|x64.Build.0 = Debug|Any CPU 156 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU 157 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Ad-Hoc|x86.Build.0 = Debug|Any CPU 158 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU 159 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.AppStore|Any CPU.Build.0 = Debug|Any CPU 160 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.AppStore|ARM.ActiveCfg = Debug|Any CPU 161 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.AppStore|ARM.Build.0 = Debug|Any CPU 162 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.AppStore|iPhone.ActiveCfg = Debug|Any CPU 163 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.AppStore|iPhone.Build.0 = Debug|Any CPU 164 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU 165 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU 166 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.AppStore|x64.ActiveCfg = Debug|Any CPU 167 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.AppStore|x64.Build.0 = Debug|Any CPU 168 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.AppStore|x86.ActiveCfg = Debug|Any CPU 169 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.AppStore|x86.Build.0 = Debug|Any CPU 170 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 171 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Debug|Any CPU.Build.0 = Debug|Any CPU 172 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Debug|ARM.ActiveCfg = Debug|Any CPU 173 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Debug|ARM.Build.0 = Debug|Any CPU 174 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Debug|iPhone.ActiveCfg = Debug|Any CPU 175 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Debug|iPhone.Build.0 = Debug|Any CPU 176 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU 177 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU 178 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Debug|x64.ActiveCfg = Debug|Any CPU 179 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Debug|x64.Build.0 = Debug|Any CPU 180 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Debug|x86.ActiveCfg = Debug|Any CPU 181 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Debug|x86.Build.0 = Debug|Any CPU 182 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Release|Any CPU.ActiveCfg = Release|Any CPU 183 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Release|Any CPU.Build.0 = Release|Any CPU 184 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Release|ARM.ActiveCfg = Release|Any CPU 185 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Release|ARM.Build.0 = Release|Any CPU 186 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Release|iPhone.ActiveCfg = Release|Any CPU 187 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Release|iPhone.Build.0 = Release|Any CPU 188 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU 189 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Release|iPhoneSimulator.Build.0 = Release|Any CPU 190 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Release|x64.ActiveCfg = Release|Any CPU 191 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Release|x64.Build.0 = Release|Any CPU 192 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Release|x86.ActiveCfg = Release|Any CPU 193 | {630D1CFC-E5E3-4AC4-A2FB-43758FE323E9}.Release|x86.Build.0 = Release|Any CPU 194 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Ad-Hoc|Any CPU.ActiveCfg = Release|x64 195 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Ad-Hoc|Any CPU.Build.0 = Release|x64 196 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Ad-Hoc|Any CPU.Deploy.0 = Release|x64 197 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Ad-Hoc|ARM.ActiveCfg = Release|ARM 198 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Ad-Hoc|ARM.Build.0 = Release|ARM 199 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Ad-Hoc|ARM.Deploy.0 = Release|ARM 200 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Ad-Hoc|iPhone.ActiveCfg = Release|x64 201 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Ad-Hoc|iPhone.Build.0 = Release|x64 202 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Ad-Hoc|iPhone.Deploy.0 = Release|x64 203 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|x64 204 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|x64 205 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Release|x64 206 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Ad-Hoc|x64.ActiveCfg = Release|x64 207 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Ad-Hoc|x64.Build.0 = Release|x64 208 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Ad-Hoc|x64.Deploy.0 = Release|x64 209 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Ad-Hoc|x86.ActiveCfg = Release|x86 210 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Ad-Hoc|x86.Build.0 = Release|x86 211 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Ad-Hoc|x86.Deploy.0 = Release|x86 212 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.AppStore|Any CPU.ActiveCfg = Release|x64 213 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.AppStore|Any CPU.Build.0 = Release|x64 214 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.AppStore|Any CPU.Deploy.0 = Release|x64 215 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.AppStore|ARM.ActiveCfg = Release|ARM 216 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.AppStore|ARM.Build.0 = Release|ARM 217 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.AppStore|ARM.Deploy.0 = Release|ARM 218 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.AppStore|iPhone.ActiveCfg = Release|x64 219 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.AppStore|iPhone.Build.0 = Release|x64 220 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.AppStore|iPhone.Deploy.0 = Release|x64 221 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.AppStore|iPhoneSimulator.ActiveCfg = Release|x64 222 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.AppStore|iPhoneSimulator.Build.0 = Release|x64 223 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.AppStore|iPhoneSimulator.Deploy.0 = Release|x64 224 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.AppStore|x64.ActiveCfg = Release|x64 225 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.AppStore|x64.Build.0 = Release|x64 226 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.AppStore|x64.Deploy.0 = Release|x64 227 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.AppStore|x86.ActiveCfg = Release|x86 228 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.AppStore|x86.Build.0 = Release|x86 229 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.AppStore|x86.Deploy.0 = Release|x86 230 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Debug|Any CPU.ActiveCfg = Debug|x86 231 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Debug|ARM.ActiveCfg = Debug|ARM 232 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Debug|ARM.Build.0 = Debug|ARM 233 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Debug|ARM.Deploy.0 = Debug|ARM 234 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Debug|iPhone.ActiveCfg = Debug|x86 235 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Debug|iPhoneSimulator.ActiveCfg = Debug|x86 236 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Debug|x64.ActiveCfg = Debug|x64 237 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Debug|x64.Build.0 = Debug|x64 238 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Debug|x64.Deploy.0 = Debug|x64 239 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Debug|x86.ActiveCfg = Debug|x86 240 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Debug|x86.Build.0 = Debug|x86 241 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Debug|x86.Deploy.0 = Debug|x86 242 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Release|Any CPU.ActiveCfg = Release|x86 243 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Release|ARM.ActiveCfg = Release|ARM 244 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Release|ARM.Build.0 = Release|ARM 245 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Release|ARM.Deploy.0 = Release|ARM 246 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Release|iPhone.ActiveCfg = Release|x86 247 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Release|iPhoneSimulator.ActiveCfg = Release|x86 248 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Release|x64.ActiveCfg = Release|x64 249 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Release|x64.Build.0 = Release|x64 250 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Release|x64.Deploy.0 = Release|x64 251 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Release|x86.ActiveCfg = Release|x86 252 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Release|x86.Build.0 = Release|x86 253 | {1CA8EF51-4818-4CBF-9F05-A52142E33823}.Release|x86.Deploy.0 = Release|x86 254 | EndGlobalSection 255 | GlobalSection(SolutionProperties) = preSolution 256 | HideSolutionNode = FALSE 257 | EndGlobalSection 258 | GlobalSection(ExtensibilityGlobals) = postSolution 259 | SolutionGuid = {3EB0E4F4-8DC7-43FF-B2E8-4E88B7B39CA3} 260 | EndGlobalSection 261 | EndGlobal 262 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.Android/Assets/AboutAssets.txt: -------------------------------------------------------------------------------- 1 | Any raw assets you want to be deployed with your application can be placed in 2 | this directory (and child directories) and given a Build Action of "AndroidAsset". 3 | 4 | These files will be deployed with you package and will be accessible using Android's 5 | AssetManager, like this: 6 | 7 | public class ReadAsset : Activity 8 | { 9 | protected override void OnCreate (Bundle bundle) 10 | { 11 | base.OnCreate (bundle); 12 | 13 | InputStream input = Assets.Open ("my_asset.txt"); 14 | } 15 | } 16 | 17 | Additionally, some Android functions will automatically load asset files: 18 | 19 | Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf"); 20 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.Android/MainActivity.cs: -------------------------------------------------------------------------------- 1 | using Android.App; 2 | using Android.Content.PM; 3 | using Android.OS; 4 | using Android.Runtime; 5 | 6 | namespace WordPressXF.Droid 7 | { 8 | [Activity(Label = "WordPressXF", Icon = "@drawable/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)] 9 | public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity 10 | { 11 | protected override void OnCreate(Bundle bundle) 12 | { 13 | TabLayoutResource = Resource.Layout.Tabbar; 14 | ToolbarResource = Resource.Layout.Toolbar; 15 | 16 | base.OnCreate(bundle); 17 | 18 | FFImageLoading.Forms.Platform.CachedImageRenderer.Init(true); 19 | Xamarin.Forms.Forms.Init(this, bundle); 20 | Xamarin.Essentials.Platform.Init(this, bundle); 21 | 22 | LoadApplication(new App()); 23 | } 24 | 25 | public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Permission[] grantResults) 26 | { 27 | Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults); 28 | 29 | base.OnRequestPermissionsResult(requestCode, permissions, grantResults); 30 | } 31 | } 32 | } 33 | 34 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.Android/Properties/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.Android/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | using Android.App; 5 | 6 | // General Information about an assembly is controlled through the following 7 | // set of attributes. Change these attribute values to modify the information 8 | // associated with an assembly. 9 | [assembly: AssemblyTitle("WordPressXF.Android")] 10 | [assembly: AssemblyDescription("")] 11 | [assembly: AssemblyConfiguration("")] 12 | [assembly: AssemblyCompany("")] 13 | [assembly: AssemblyProduct("WordPressXF.Android")] 14 | [assembly: AssemblyCopyright("Copyright © 2014")] 15 | [assembly: AssemblyTrademark("")] 16 | [assembly: AssemblyCulture("")] 17 | [assembly: ComVisible(false)] 18 | 19 | // Version information for an assembly consists of the following four values: 20 | // 21 | // Major Version 22 | // Minor Version 23 | // Build Number 24 | // Revision 25 | // 26 | // You can specify all the values or you can default the Build and Revision Numbers 27 | // by using the '*' as shown below: 28 | // [assembly: AssemblyVersion("1.0.*")] 29 | [assembly: AssemblyVersion("1.0.0.0")] 30 | [assembly: AssemblyFileVersion("1.0.0.0")] 31 | 32 | // Add some common permissions, these can be removed if not needed 33 | [assembly: UsesPermission(Android.Manifest.Permission.Internet)] 34 | [assembly: UsesPermission(Android.Manifest.Permission.WriteExternalStorage)] 35 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.Android/Resources/AboutResources.txt: -------------------------------------------------------------------------------- 1 | Images, layout descriptions, binary blobs and string dictionaries can be included 2 | in your application as resource files. Various Android APIs are designed to 3 | operate on the resource IDs instead of dealing with images, strings or binary blobs 4 | directly. 5 | 6 | For example, a sample Android app that contains a user interface layout (main.xml), 7 | an internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png) 8 | would keep its resources in the "Resources" directory of the application: 9 | 10 | Resources/ 11 | drawable-hdpi/ 12 | icon.png 13 | 14 | drawable-ldpi/ 15 | icon.png 16 | 17 | drawable-mdpi/ 18 | icon.png 19 | 20 | layout/ 21 | main.xml 22 | 23 | values/ 24 | strings.xml 25 | 26 | In order to get the build system to recognize Android resources, set the build action to 27 | "AndroidResource". The native Android APIs do not operate directly with filenames, but 28 | instead operate on resource IDs. When you compile an Android application that uses resources, 29 | the build system will package the resources for distribution and generate a class called 30 | "Resource" that contains the tokens for each one of the resources included. For example, 31 | for the above Resources layout, this is what the Resource class would expose: 32 | 33 | public class Resource { 34 | public class drawable { 35 | public const int icon = 0x123; 36 | } 37 | 38 | public class layout { 39 | public const int main = 0x456; 40 | } 41 | 42 | public class strings { 43 | public const int first_string = 0xabc; 44 | public const int second_string = 0xbcd; 45 | } 46 | } 47 | 48 | You would then use R.drawable.icon to reference the drawable/icon.png file, or Resource.layout.main 49 | to reference the layout/main.xml file, or Resource.strings.first_string to reference the first 50 | string in the dictionary file values/strings.xml. 51 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.Android/Resources/drawable-hdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.Android/Resources/drawable-hdpi/icon.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.Android/Resources/drawable-xhdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.Android/Resources/drawable-xhdpi/icon.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.Android/Resources/drawable-xxhdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.Android/Resources/drawable-xxhdpi/icon.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.Android/Resources/drawable/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.Android/Resources/drawable/icon.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.Android/Resources/layout/Tabbar.axml: -------------------------------------------------------------------------------- 1 | 2 | 12 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.Android/Resources/layout/Toolbar.axml: -------------------------------------------------------------------------------- 1 | 9 | 10 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.Android/Resources/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 26 | 27 | 30 | 31 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.Android/app.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.Android/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.UWP/App.xaml: -------------------------------------------------------------------------------- 1 |  6 | 7 | 8 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.UWP/App.xaml.cs: -------------------------------------------------------------------------------- 1 | using FFImageLoading.Forms; 2 | using FFImageLoading.Forms.Platform; 3 | using System; 4 | using System.Collections.Generic; 5 | using System.IO; 6 | using System.Linq; 7 | using System.Runtime.InteropServices.WindowsRuntime; 8 | using Windows.ApplicationModel; 9 | using Windows.ApplicationModel.Activation; 10 | using Windows.Foundation; 11 | using Windows.Foundation.Collections; 12 | using Windows.UI.Xaml; 13 | using Windows.UI.Xaml.Controls; 14 | using Windows.UI.Xaml.Controls.Primitives; 15 | using Windows.UI.Xaml.Data; 16 | using Windows.UI.Xaml.Input; 17 | using Windows.UI.Xaml.Media; 18 | using Windows.UI.Xaml.Navigation; 19 | 20 | namespace WordPressXF.UWP 21 | { 22 | /// 23 | /// Provides application-specific behavior to supplement the default Application class. 24 | /// 25 | sealed partial class App : Application 26 | { 27 | /// 28 | /// Initializes the singleton application object. This is the first line of authored code 29 | /// executed, and as such is the logical equivalent of main() or WinMain(). 30 | /// 31 | public App() 32 | { 33 | this.InitializeComponent(); 34 | this.Suspending += OnSuspending; 35 | } 36 | 37 | /// 38 | /// Invoked when the application is launched normally by the end user. Other entry points 39 | /// will be used such as when the application is launched to open a specific file. 40 | /// 41 | /// Details about the launch request and process. 42 | protected override void OnLaunched(LaunchActivatedEventArgs e) 43 | { 44 | Frame rootFrame = Window.Current.Content as Frame; 45 | 46 | // Do not repeat app initialization when the Window already has content, 47 | // just ensure that the window is active 48 | if (rootFrame == null) 49 | { 50 | // Create a Frame to act as the navigation context and navigate to the first page 51 | rootFrame = new Frame(); 52 | 53 | rootFrame.NavigationFailed += OnNavigationFailed; 54 | 55 | CachedImageRenderer.Init(); 56 | Xamarin.Forms.Forms.Init(e); 57 | 58 | if (e.PreviousExecutionState == ApplicationExecutionState.Terminated) 59 | { 60 | //TODO: Load state from previously suspended application 61 | } 62 | 63 | // Place the frame in the current Window 64 | Window.Current.Content = rootFrame; 65 | } 66 | 67 | if (e.PrelaunchActivated == false) 68 | { 69 | if (rootFrame.Content == null) 70 | { 71 | // When the navigation stack isn't restored navigate to the first page, 72 | // configuring the new page by passing required information as a navigation 73 | // parameter 74 | rootFrame.Navigate(typeof(MainPage), e.Arguments); 75 | } 76 | // Ensure the current window is active 77 | Window.Current.Activate(); 78 | } 79 | } 80 | 81 | /// 82 | /// Invoked when Navigation to a certain page fails 83 | /// 84 | /// The Frame which failed navigation 85 | /// Details about the navigation failure 86 | void OnNavigationFailed(object sender, NavigationFailedEventArgs e) 87 | { 88 | throw new Exception("Failed to load Page " + e.SourcePageType.FullName); 89 | } 90 | 91 | /// 92 | /// Invoked when application execution is being suspended. Application state is saved 93 | /// without knowing whether the application will be terminated or resumed with the contents 94 | /// of memory still intact. 95 | /// 96 | /// The source of the suspend request. 97 | /// Details about the suspend request. 98 | private void OnSuspending(object sender, SuspendingEventArgs e) 99 | { 100 | var deferral = e.SuspendingOperation.GetDeferral(); 101 | //TODO: Save application state and stop any background activity 102 | deferral.Complete(); 103 | } 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.UWP/Assets/LockScreenLogo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.UWP/Assets/LockScreenLogo.scale-200.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.UWP/Assets/SplashScreen.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.UWP/Assets/SplashScreen.scale-200.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.UWP/Assets/Square150x150Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.UWP/Assets/Square150x150Logo.scale-200.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.UWP/Assets/Square44x44Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.UWP/Assets/Square44x44Logo.scale-200.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.UWP/Assets/Square44x44Logo.targetsize-24_altform-unplated.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.UWP/Assets/Square44x44Logo.targetsize-24_altform-unplated.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.UWP/Assets/StoreLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.UWP/Assets/StoreLogo.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.UWP/Assets/Wide310x150Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.UWP/Assets/Wide310x150Logo.scale-200.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.UWP/MainPage.xaml: -------------------------------------------------------------------------------- 1 |  10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.UWP/MainPage.xaml.cs: -------------------------------------------------------------------------------- 1 | using Xamarin.Forms.Platform.UWP; 2 | 3 | namespace WordPressXF.UWP 4 | { 5 | public sealed partial class MainPage : WindowsPage 6 | { 7 | public MainPage() 8 | { 9 | this.InitializeComponent(); 10 | 11 | LoadApplication(new WordPressXF.App()); 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.UWP/Package.appxmanifest: -------------------------------------------------------------------------------- 1 |  2 | 3 | 8 | 9 | 13 | 14 | 15 | 16 | 17 | WordPressXF.UWP 18 | SebastianJensen 19 | Assets\StoreLogo.png 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 34 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.UWP/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("WordPressXF.UWP")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("WordPressXF.UWP")] 13 | [assembly: AssemblyCopyright("Copyright © 2018")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Version information for an assembly consists of the following four values: 18 | // 19 | // Major Version 20 | // Minor Version 21 | // Build Number 22 | // Revision 23 | // 24 | // You can specify all the values or you can default the Build and Revision Numbers 25 | // by using the '*' as shown below: 26 | // [assembly: AssemblyVersion("1.0.*")] 27 | [assembly: AssemblyVersion("1.0.0.0")] 28 | [assembly: AssemblyFileVersion("1.0.0.0")] 29 | [assembly: ComVisible(false)] -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.UWP/Properties/Default.rd.xml: -------------------------------------------------------------------------------- 1 | 17 | 18 | 19 | 20 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.UWP/WordPressXF.UWP.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | x86 7 | {1CA8EF51-4818-4CBF-9F05-A52142E33823} 8 | AppContainerExe 9 | Properties 10 | WordPressXF.UWP 11 | WordPressXF.UWP 12 | en-US 13 | UAP 14 | 10.0.17134.0 15 | 10.0.16299.0 16 | 14 17 | 512 18 | {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 19 | true 20 | WordPressXF.UWP_TemporaryKey.pfx 21 | 22 | 23 | true 24 | bin\x86\Debug\ 25 | DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP 26 | ;2008 27 | full 28 | x86 29 | false 30 | prompt 31 | true 32 | 33 | 34 | bin\x86\Release\ 35 | TRACE;NETFX_CORE;WINDOWS_UWP 36 | true 37 | ;2008 38 | pdbonly 39 | x86 40 | false 41 | prompt 42 | true 43 | true 44 | 45 | 46 | true 47 | bin\ARM\Debug\ 48 | DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP 49 | ;2008 50 | full 51 | ARM 52 | false 53 | prompt 54 | true 55 | 56 | 57 | bin\ARM\Release\ 58 | TRACE;NETFX_CORE;WINDOWS_UWP 59 | true 60 | ;2008 61 | pdbonly 62 | ARM 63 | false 64 | prompt 65 | true 66 | true 67 | 68 | 69 | true 70 | bin\x64\Debug\ 71 | DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP 72 | ;2008 73 | full 74 | x64 75 | false 76 | prompt 77 | true 78 | 79 | 80 | bin\x64\Release\ 81 | TRACE;NETFX_CORE;WINDOWS_UWP 82 | true 83 | ;2008 84 | pdbonly 85 | x64 86 | false 87 | prompt 88 | true 89 | true 90 | 91 | 92 | PackageReference 93 | 94 | 95 | 96 | App.xaml 97 | 98 | 99 | MainPage.xaml 100 | 101 | 102 | 103 | 104 | 105 | Designer 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | MSBuild:Compile 122 | Designer 123 | 124 | 125 | MSBuild:Compile 126 | Designer 127 | 128 | 129 | 130 | 131 | 4.5.0 132 | 133 | 134 | 2.1.2 135 | 136 | 137 | 6.1.9 138 | 139 | 140 | 4.3.0 141 | 142 | 143 | 2.0.1 144 | 145 | 146 | 11.0.2 147 | 148 | 149 | 2.0.147 150 | 151 | 152 | 0.5.155 153 | 154 | 155 | 0.5.155 156 | 157 | 158 | 0.5.155 159 | 160 | 161 | 0.5.155 162 | 163 | 164 | 5.8.11 165 | 166 | 167 | 2.4.18 168 | 169 | 170 | 1.6.0-beta1 171 | 172 | 173 | 1.6.0.3 174 | 175 | 176 | 0.11.0-preview 177 | 178 | 179 | 2.4.3.840 180 | 181 | 182 | 2.4.3.840 183 | 184 | 185 | 3.3.0.967583 186 | 187 | 188 | 189 | 190 | {630d1cfc-e5e3-4ac4-a2fb-43758fe323e9} 191 | WordPressXF 192 | 193 | 194 | 195 | 14.0 196 | 197 | 198 | 205 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/AppDelegate.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using FFImageLoading.Forms.Touch; 5 | using Foundation; 6 | using UIKit; 7 | 8 | namespace WordPressXF.iOS 9 | { 10 | // The UIApplicationDelegate for the application. This class is responsible for launching the 11 | // User Interface of the application, as well as listening (and optionally responding) to 12 | // application events from iOS. 13 | [Register("AppDelegate")] 14 | public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate 15 | { 16 | // 17 | // This method is invoked when the application has loaded and is ready to run. In this 18 | // method you should instantiate the window, load the UI into it and then make the window 19 | // visible. 20 | // 21 | // You have 17 seconds to return from this method, or iOS will terminate your application. 22 | // 23 | public override bool FinishedLaunching(UIApplication app, NSDictionary options) 24 | { 25 | CachedImageRenderer.Init(); 26 | global::Xamarin.Forms.Forms.Init(); 27 | LoadApplication(new App()); 28 | 29 | return base.FinishedLaunching(app, options); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/Entitlements.plist: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/Info.plist: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | UIDeviceFamily 6 | 7 | 1 8 | 2 9 | 10 | UISupportedInterfaceOrientations 11 | 12 | UIInterfaceOrientationPortrait 13 | UIInterfaceOrientationLandscapeLeft 14 | UIInterfaceOrientationLandscapeRight 15 | 16 | UISupportedInterfaceOrientations~ipad 17 | 18 | UIInterfaceOrientationPortrait 19 | UIInterfaceOrientationPortraitUpsideDown 20 | UIInterfaceOrientationLandscapeLeft 21 | UIInterfaceOrientationLandscapeRight 22 | 23 | MinimumOSVersion 24 | 8.0 25 | CFBundleDisplayName 26 | WordPressXF 27 | CFBundleIdentifier 28 | com.yourcompany.WordPressXF 29 | CFBundleVersion 30 | 1.0 31 | CFBundleIconFiles 32 | 33 | Icon-60@2x 34 | Icon-60@3x 35 | Icon-76 36 | Icon-76@2x 37 | Default 38 | Default@2x 39 | Default-568h@2x 40 | Default-Portrait 41 | Default-Portrait@2x 42 | Icon-Small-40 43 | Icon-Small-40@2x 44 | Icon-Small-40@3x 45 | Icon-Small 46 | Icon-Small@2x 47 | Icon-Small@3x 48 | 49 | UILaunchStoryboardName 50 | LaunchScreen 51 | 52 | 53 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/Main.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | 5 | using Foundation; 6 | using UIKit; 7 | 8 | namespace WordPressXF.iOS 9 | { 10 | public class Application 11 | { 12 | // This is the main entry point of the application. 13 | static void Main(string[] args) 14 | { 15 | // if you want to use a different Application Delegate class from "AppDelegate" 16 | // you can specify it here. 17 | UIApplication.Main(args, null, "AppDelegate"); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("WordPressXF.iOS")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("WordPressXF.iOS")] 13 | [assembly: AssemblyCopyright("Copyright © 2014")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("72bdc44f-c588-44f3-b6df-9aace7daafdd")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/Resources/Default-568h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.iOS/Resources/Default-568h@2x.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/Resources/Default-Portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.iOS/Resources/Default-Portrait.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/Resources/Default-Portrait@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.iOS/Resources/Default-Portrait@2x.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/Resources/Default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.iOS/Resources/Default.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/Resources/Default@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.iOS/Resources/Default@2x.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/Resources/Icon-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.iOS/Resources/Icon-60@2x.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/Resources/Icon-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.iOS/Resources/Icon-60@3x.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/Resources/Icon-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.iOS/Resources/Icon-76.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/Resources/Icon-76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.iOS/Resources/Icon-76@2x.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/Resources/Icon-Small-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.iOS/Resources/Icon-Small-40.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/Resources/Icon-Small-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.iOS/Resources/Icon-Small-40@2x.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/Resources/Icon-Small-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.iOS/Resources/Icon-Small-40@3x.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/Resources/Icon-Small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.iOS/Resources/Icon-Small.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/Resources/Icon-Small@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.iOS/Resources/Icon-Small@2x.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/Resources/Icon-Small@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.iOS/Resources/Icon-Small@3x.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/Resources/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/Resources/comments.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.iOS/Resources/comments.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/Resources/comments@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.iOS/Resources/comments@2x.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/Resources/comments@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.iOS/Resources/comments@3x.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/Resources/hamburger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.iOS/Resources/hamburger.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/Resources/hamburger@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.iOS/Resources/hamburger@2x.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/Resources/hamburger@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.iOS/Resources/hamburger@3x.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/Resources/post.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.iOS/Resources/post.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/Resources/post@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.iOS/Resources/post@2x.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/Resources/post@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.iOS/Resources/post@3x.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/WordPressXF.iOS.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | iPhoneSimulator 7 | 8.0.30703 8 | 2.0 9 | {3A4A2217-74B3-43D2-9134-CEB14A5C3393} 10 | {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 11 | Exe 12 | WordPressXF.iOS 13 | Resources 14 | WordPressXF.iOS 15 | 16 | 17 | 18 | 19 | true 20 | full 21 | false 22 | bin\iPhoneSimulator\Debug 23 | DEBUG 24 | prompt 25 | 4 26 | false 27 | i386, x86_64 28 | None 29 | true 30 | 31 | 32 | none 33 | true 34 | bin\iPhoneSimulator\Release 35 | prompt 36 | 4 37 | None 38 | i386, x86_64 39 | false 40 | 41 | 42 | true 43 | full 44 | false 45 | bin\iPhone\Debug 46 | DEBUG 47 | prompt 48 | 4 49 | false 50 | ARMv7, ARM64 51 | iPhone Developer 52 | true 53 | Entitlements.plist 54 | 55 | 56 | none 57 | true 58 | bin\iPhone\Release 59 | prompt 60 | 4 61 | ARMv7, ARM64 62 | false 63 | iPhone Developer 64 | Entitlements.plist 65 | 66 | 67 | none 68 | True 69 | bin\iPhone\Ad-Hoc 70 | prompt 71 | 4 72 | False 73 | ARMv7, ARM64 74 | True 75 | Automatic:AdHoc 76 | iPhone Distribution 77 | Entitlements.plist 78 | 79 | 80 | none 81 | True 82 | bin\iPhone\AppStore 83 | prompt 84 | 4 85 | False 86 | ARMv7, ARM64 87 | Automatic:AppStore 88 | iPhone Distribution 89 | Entitlements.plist 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | ..\..\packages\Unity.5.8.11\lib\netstandard2.0\CommonServiceLocator.dll 123 | 124 | 125 | ..\..\packages\Xamarin.FFImageLoading.2.4.3.840\lib\Xamarin.iOS10\FFImageLoading.dll 126 | 127 | 128 | ..\..\packages\Xamarin.FFImageLoading.Forms.2.4.3.840\lib\Xamarin.iOS10\FFImageLoading.Forms.dll 129 | 130 | 131 | ..\..\packages\Xamarin.FFImageLoading.Forms.2.4.3.840\lib\Xamarin.iOS10\FFImageLoading.Forms.Platform.dll 132 | 133 | 134 | ..\..\packages\Xamarin.FFImageLoading.2.4.3.840\lib\Xamarin.iOS10\FFImageLoading.Platform.dll 135 | 136 | 137 | 138 | ..\..\packages\Newtonsoft.Json.11.0.2\lib\netstandard2.0\Newtonsoft.Json.dll 139 | True 140 | 141 | 142 | ..\..\packages\PCLCrypto.2.0.147\lib\xamarinios10\PCLCrypto.dll 143 | 144 | 145 | ..\..\packages\PInvoke.BCrypt.0.5.155\lib\portable-net45+win8+wpa81\PInvoke.BCrypt.dll 146 | 147 | 148 | ..\..\packages\PInvoke.Kernel32.0.5.155\lib\portable-net45+win8+wpa81\PInvoke.Kernel32.dll 149 | 150 | 151 | ..\..\packages\PInvoke.NCrypt.0.5.155\lib\portable-net45+win8+wpa81\PInvoke.NCrypt.dll 152 | 153 | 154 | ..\..\packages\PInvoke.Windows.Core.0.5.155\lib\portable-net45+win8+wpa81\PInvoke.Windows.Core.dll 155 | 156 | 157 | 158 | ..\..\packages\System.Configuration.ConfigurationManager.4.5.0\lib\netstandard2.0\System.Configuration.ConfigurationManager.dll 159 | 160 | 161 | 162 | 163 | 164 | ..\..\packages\System.Security.AccessControl.4.5.0\lib\netstandard2.0\System.Security.AccessControl.dll 165 | 166 | 167 | ..\..\packages\System.Security.Permissions.4.5.0\lib\netstandard2.0\System.Security.Permissions.dll 168 | 169 | 170 | ..\..\packages\System.Security.Principal.Windows.4.5.1\lib\netstandard2.0\System.Security.Principal.Windows.dll 171 | 172 | 173 | 174 | 175 | ..\..\packages\Unity.5.8.11\lib\netstandard2.0\Unity.Abstractions.dll 176 | 177 | 178 | ..\..\packages\Unity.5.8.11\lib\netstandard2.0\Unity.Configuration.dll 179 | 180 | 181 | ..\..\packages\Unity.5.8.11\lib\netstandard2.0\Unity.Container.dll 182 | 183 | 184 | ..\..\packages\Unity.5.8.11\lib\netstandard2.0\Unity.Interception.dll 185 | 186 | 187 | ..\..\packages\Unity.5.8.11\lib\netstandard2.0\Unity.Interception.Configuration.dll 188 | 189 | 190 | ..\..\packages\Unity.5.8.11\lib\netstandard2.0\Unity.RegistrationByConvention.dll 191 | 192 | 193 | ..\..\packages\Unity.5.8.11\lib\netstandard2.0\Unity.ServiceLocation.dll 194 | 195 | 196 | ..\..\packages\Validation.2.4.18\lib\netstandard1.3\Validation.dll 197 | 198 | 199 | ..\..\packages\WebP.Touch.1.0.8\lib\Xamarin.iOS10\WebP.Touch.dll 200 | 201 | 202 | ..\..\packages\WordPressPCL.1.6.0-beta1\lib\netstandard2.0\WordPressPCL.dll 203 | 204 | 205 | ..\..\packages\Xamarin.Auth.1.6.0.3\lib\Xamarin.iOS10\Xamarin.Auth.dll 206 | 207 | 208 | ..\..\packages\Xamarin.Essentials.0.11.0-preview\lib\xamarinios10\Xamarin.Essentials.dll 209 | 210 | 211 | ..\..\packages\Xamarin.Forms.3.3.0.967583\lib\Xamarin.iOS10\Xamarin.Forms.Core.dll 212 | 213 | 214 | ..\..\packages\Xamarin.Forms.3.3.0.967583\lib\Xamarin.iOS10\Xamarin.Forms.Platform.dll 215 | 216 | 217 | ..\..\packages\Xamarin.Forms.3.3.0.967583\lib\Xamarin.iOS10\Xamarin.Forms.Platform.iOS.dll 218 | 219 | 220 | ..\..\packages\Xamarin.Forms.3.3.0.967583\lib\Xamarin.iOS10\Xamarin.Forms.Xaml.dll 221 | 222 | 223 | 224 | 225 | 226 | {630d1cfc-e5e3-4ac4-a2fb-43758fe323e9} 227 | WordPressXF 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/app.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/iTunesArtwork: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.iOS/iTunesArtwork -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/iTunesArtwork@2x: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF.iOS/iTunesArtwork@2x -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF.iOS/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/App.xaml: -------------------------------------------------------------------------------- 1 |  2 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/App.xaml.cs: -------------------------------------------------------------------------------- 1 | using WordPressXF.Init; 2 | using WordPressXF.Views; 3 | using Xamarin.Forms; 4 | 5 | namespace WordPressXF 6 | { 7 | public partial class App : Application 8 | { 9 | public App() 10 | { 11 | InitializeComponent(); 12 | 13 | Bootstrapper.RegisterDependencies(); 14 | 15 | MainPage = new SplashScreen(); 16 | } 17 | 18 | protected override void OnStart() 19 | { 20 | // Handle when your app starts 21 | } 22 | 23 | protected override void OnSleep() 24 | { 25 | // Handle when your app sleeps 26 | } 27 | 28 | protected override void OnResume() 29 | { 30 | // Handle when your app resumes 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/Assets/menuheader.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF/Assets/menuheader.png -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/Assets/placeholder.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wp-net/WordPressXF/bbf4ba115b0b45b94c147b1a66c1e1208bdd9b06/WordPressXF/WordPressXF/WordPressXF/Assets/placeholder.jpg -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/Behaviors/BaseBehavior.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Xamarin.Forms; 3 | 4 | namespace WordPressXF.Behaviors 5 | { 6 | public class BaseBehavior : Behavior where T : BindableObject 7 | { 8 | public T AssociatedObject { get; private set; } 9 | 10 | protected override void OnAttachedTo(T bindable) 11 | { 12 | base.OnAttachedTo(bindable); 13 | 14 | AssociatedObject = bindable; 15 | 16 | if (bindable.BindingContext != null) 17 | BindingContext = bindable.BindingContext; 18 | 19 | bindable.BindingContextChanged += OnBindingContextChanged; 20 | } 21 | 22 | protected override void OnDetachingFrom(T bindable) 23 | { 24 | base.OnDetachingFrom(bindable); 25 | 26 | bindable.BindingContextChanged -= OnBindingContextChanged; 27 | AssociatedObject = null; 28 | } 29 | 30 | private void OnBindingContextChanged(object sender, EventArgs e) 31 | { 32 | OnBindingContextChanged(); 33 | } 34 | 35 | protected override void OnBindingContextChanged() 36 | { 37 | base.OnBindingContextChanged(); 38 | 39 | BindingContext = AssociatedObject.BindingContext; 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/Behaviors/EventToCommandBehavior.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Reflection; 3 | using System.Windows.Input; 4 | using Xamarin.Forms; 5 | 6 | namespace WordPressXF.Behaviors 7 | { 8 | public class EventToCommandBehavior : BaseBehavior 9 | { 10 | private Delegate _eventHandler; 11 | 12 | public static readonly BindableProperty EventNameProperty = 13 | BindableProperty.Create("EventName", typeof(string), typeof(EventToCommandBehavior), null, propertyChanged: OnEventNameChanged); 14 | 15 | public static readonly BindableProperty CommandProperty = 16 | BindableProperty.Create("Command", typeof(ICommand), typeof(EventToCommandBehavior)); 17 | 18 | public static readonly BindableProperty CommandParameterProperty = 19 | BindableProperty.Create("CommandParameter", typeof(object), typeof(EventToCommandBehavior)); 20 | 21 | public static readonly BindableProperty InputConverterProperty = 22 | BindableProperty.Create("Converter", typeof(IValueConverter), typeof(EventToCommandBehavior)); 23 | 24 | public string EventName 25 | { 26 | get => (string)GetValue(EventNameProperty); 27 | set => SetValue(EventNameProperty, value); 28 | } 29 | 30 | public ICommand Command 31 | { 32 | get => (ICommand)GetValue(CommandProperty); 33 | set => SetValue(CommandProperty, value); 34 | } 35 | 36 | public object CommandParameter 37 | { 38 | get => GetValue(CommandParameterProperty); 39 | set => SetValue(CommandParameterProperty, value); 40 | } 41 | 42 | public IValueConverter Converter 43 | { 44 | get => (IValueConverter)GetValue(InputConverterProperty); 45 | set => SetValue(InputConverterProperty, value); 46 | } 47 | 48 | protected override void OnAttachedTo(View bindable) 49 | { 50 | base.OnAttachedTo(bindable); 51 | 52 | RegisterEvent(EventName); 53 | } 54 | 55 | protected override void OnDetachingFrom(View bindable) 56 | { 57 | DeregisterEvent(EventName); 58 | 59 | base.OnDetachingFrom(bindable); 60 | } 61 | 62 | private void RegisterEvent(string name) 63 | { 64 | if (string.IsNullOrWhiteSpace(name)) 65 | return; 66 | 67 | var eventInfo = AssociatedObject.GetType().GetRuntimeEvent(name); 68 | if (eventInfo == null) 69 | throw new ArgumentException(string.Format("EventToCommandBehavior: Can't register the '{0}' event.", EventName)); 70 | 71 | var methodInfo = typeof(EventToCommandBehavior).GetTypeInfo().GetDeclaredMethod("OnEvent"); 72 | 73 | _eventHandler = methodInfo.CreateDelegate(eventInfo.EventHandlerType, this); 74 | eventInfo.AddEventHandler(AssociatedObject, _eventHandler); 75 | } 76 | 77 | private void DeregisterEvent(string name) 78 | { 79 | if (string.IsNullOrWhiteSpace(name)) 80 | return; 81 | 82 | if (_eventHandler == null) 83 | return; 84 | 85 | var eventInfo = AssociatedObject.GetType().GetRuntimeEvent(name); 86 | if (eventInfo == null) 87 | throw new ArgumentException(string.Format("EventToCommandBehavior: Can't de-register the '{0}' event.", EventName)); 88 | 89 | eventInfo.RemoveEventHandler(AssociatedObject, _eventHandler); 90 | _eventHandler = null; 91 | } 92 | 93 | private void OnEvent(object sender, object eventArgs) 94 | { 95 | if (Command == null) 96 | return; 97 | 98 | object resolvedParameter; 99 | if (CommandParameter != null) 100 | resolvedParameter = CommandParameter; 101 | else if (Converter != null) 102 | resolvedParameter = Converter.Convert(eventArgs, typeof(object), null, null); 103 | else 104 | resolvedParameter = eventArgs; 105 | 106 | if (Command.CanExecute(resolvedParameter)) 107 | Command.Execute(resolvedParameter); 108 | } 109 | 110 | private static void OnEventNameChanged(BindableObject bindable, object oldValue, object newValue) 111 | { 112 | var behavior = (EventToCommandBehavior)bindable; 113 | if (behavior.AssociatedObject == null) 114 | return; 115 | 116 | var oldEventName = (string)oldValue; 117 | var newEventName = (string)newValue; 118 | 119 | behavior.DeregisterEvent(oldEventName); 120 | behavior.RegisterEvent(newEventName); 121 | } 122 | } 123 | } -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/Common/AsyncRelayCommand.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading.Tasks; 3 | using System.Windows.Input; 4 | 5 | namespace WordPressXF.Common 6 | { 7 | public class AsyncRelayCommand : ICommand 8 | { 9 | private readonly Func _execute; 10 | private readonly Func _canExecute; 11 | 12 | public event EventHandler CanExecuteChanged; 13 | 14 | public AsyncRelayCommand(Func execute) : this(execute, null) 15 | { 16 | } 17 | 18 | public AsyncRelayCommand(Func execute, Func canExecute) 19 | { 20 | _execute = execute ?? throw new ArgumentNullException(nameof(execute)); 21 | _canExecute = canExecute; 22 | } 23 | 24 | public bool CanExecute(object parameter) 25 | { 26 | return _canExecute == null || _canExecute(); 27 | } 28 | 29 | public async void Execute(object parameter) 30 | { 31 | await ExecuteAsync(); 32 | } 33 | 34 | public async void Execute() 35 | { 36 | await ExecuteAsync(); 37 | } 38 | 39 | 40 | public async Task ExecuteAsync() 41 | { 42 | await _execute(); 43 | } 44 | 45 | public void RaiseCanExecuteChange() 46 | { 47 | var handler = CanExecuteChanged; 48 | handler?.Invoke(this, EventArgs.Empty); 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/Common/AsyncRelayCommandGeneric.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading.Tasks; 3 | using System.Windows.Input; 4 | 5 | namespace WordPressXF.Common 6 | { 7 | public class AsyncRelayCommand : ICommand 8 | { 9 | private readonly Func _execute; 10 | private readonly Func _canExecute; 11 | 12 | public event EventHandler CanExecuteChanged; 13 | 14 | public AsyncRelayCommand(Func execute) : this(execute, null) 15 | { 16 | } 17 | 18 | public AsyncRelayCommand(Func execute, Func canExecute) 19 | { 20 | _execute = execute ?? throw new ArgumentNullException(nameof(execute)); 21 | _canExecute = canExecute; 22 | } 23 | 24 | public bool CanExecute(object parameter) 25 | { 26 | return _canExecute == null || _canExecute(); 27 | } 28 | 29 | public async void Execute(object parameter) 30 | { 31 | await ExecuteAsync(parameter); 32 | } 33 | 34 | public async Task ExecuteAsync(object parameter) 35 | { 36 | await _execute((T)parameter); 37 | } 38 | 39 | public void RaiseCanExecuteChanged() 40 | { 41 | var handler = CanExecuteChanged; 42 | handler?.Invoke(this, EventArgs.Empty); 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/Controls/ExternalWebView.cs: -------------------------------------------------------------------------------- 1 | using Xamarin.Essentials; 2 | using Xamarin.Forms; 3 | 4 | namespace WordPressXF.Controls 5 | { 6 | public class ExternalWebView : WebView 7 | { 8 | public ExternalWebView() 9 | { 10 | Navigating += ExternalWebViewOnNavigating; 11 | } 12 | 13 | private async void ExternalWebViewOnNavigating(object sender, WebNavigatingEventArgs e) 14 | { 15 | if (!e.Url.StartsWith("http")) 16 | return; 17 | 18 | if (!e.Url.StartsWith("https")) 19 | return; 20 | 21 | if (e.Url.StartsWith("https://www.youtube.com/")) 22 | return; 23 | 24 | if (e.Url.StartsWith("https://syndication.twitter.com/") || e.Url.StartsWith("https://platform.twitter.com/")) 25 | return; 26 | 27 | e.Cancel = true; 28 | 29 | await Browser.OpenAsync(e.Url, BrowserLaunchMode.External); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/Controls/IncrementalListView.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using WordPressXF.Interfaces; 4 | using Xamarin.Forms; 5 | 6 | namespace WordPressXF.Controls 7 | { 8 | public class IncrementalListView : ListView 9 | { 10 | public static readonly BindableProperty PreloadCountProperty = 11 | BindableProperty.Create(nameof(PreloadCount), typeof(int), typeof(IncrementalListView), 5); 12 | 13 | public int PreloadCount 14 | { 15 | get => (int)GetValue(PreloadCountProperty); 16 | set => SetValue(PreloadCountProperty, value); 17 | } 18 | 19 | private int _lastPosition; 20 | private IList _itemsSource; 21 | private ISupportIncrementalLoading _incrementalLoading; 22 | 23 | public IncrementalListView() 24 | { 25 | ItemAppearing += OnItemAppearing; 26 | ItemTapped += (s, e) => 27 | { 28 | if (e.Item == null) 29 | return; 30 | ((IncrementalListView)s).SelectedItem = null; 31 | }; 32 | } 33 | 34 | ~IncrementalListView() 35 | { 36 | ItemAppearing -= OnItemAppearing; 37 | } 38 | 39 | protected override void OnPropertyChanged(string propertyName = null) 40 | { 41 | base.OnPropertyChanged(propertyName); 42 | 43 | if (propertyName != ItemsSourceProperty.PropertyName) 44 | return; 45 | 46 | _itemsSource = ItemsSource as IList; 47 | if (ItemsSource == null) 48 | throw new NotSupportedException($"{nameof(IncrementalListView)} requires that {nameof(ItemsSource)} be of type IList"); 49 | } 50 | 51 | protected override void OnBindingContextChanged() 52 | { 53 | base.OnBindingContextChanged(); 54 | 55 | if (BindingContext == null) 56 | return; 57 | 58 | _incrementalLoading = BindingContext as ISupportIncrementalLoading; 59 | 60 | if (_incrementalLoading == null) 61 | throw new NotSupportedException($"{nameof(IncrementalListView)} BindingContext does not implement {nameof(ISupportIncrementalLoading)}. This is required for incremental loading to work."); 62 | } 63 | 64 | private void OnItemAppearing(object sender, ItemVisibilityEventArgs e) 65 | { 66 | var position = _itemsSource?.IndexOf(e.Item) ?? 0; 67 | 68 | if (_itemsSource == null) 69 | return; 70 | 71 | if (PreloadCount <= 0) 72 | PreloadCount = 1; 73 | 74 | var preloadIndex = Math.Max(_itemsSource.Count - PreloadCount, 0); 75 | 76 | if ((position > _lastPosition || position == _itemsSource.Count - 1) && position >= preloadIndex) 77 | { 78 | _lastPosition = position; 79 | 80 | if (!_incrementalLoading.IsIncrementalLoading && !IsRefreshing && _incrementalLoading.HasMoreItems) 81 | LoadMoreItems(); 82 | } 83 | } 84 | 85 | private void LoadMoreItems() 86 | { 87 | var command = _incrementalLoading.LoadMoreItemsCommand; 88 | if (command != null && command.CanExecute(null)) 89 | command.Execute(null); 90 | } 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/Converters/CurrentUserToIsVisibleConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Globalization; 3 | using Xamarin.Forms; 4 | 5 | namespace WordPressXF.Converters 6 | { 7 | public class CurrentUserToIsVisibleConverter : IValueConverter 8 | { 9 | public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 10 | { 11 | if (value == null) 12 | { 13 | return parameter == null; 14 | } 15 | 16 | return parameter != null; 17 | } 18 | 19 | public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 20 | { 21 | throw new NotImplementedException(); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/Converters/FeaturedImageConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Globalization; 4 | using System.Linq; 5 | using WordPressPCL.Models; 6 | using Xamarin.Forms; 7 | 8 | namespace WordPressXF.Converters 9 | { 10 | public class FeaturedImageConverter : IValueConverter 11 | { 12 | public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 13 | { 14 | if (!(value is Embedded embedded)) 15 | return string.Empty; 16 | 17 | if (embedded.WpFeaturedmedia == null) 18 | return string.Empty; 19 | 20 | var mediaList = new List(embedded.WpFeaturedmedia); 21 | return mediaList.Any() ? mediaList.First().SourceUrl : string.Empty; 22 | } 23 | 24 | public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 25 | { 26 | throw new NotImplementedException(); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/Converters/HtmlConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Globalization; 3 | using System.Net; 4 | using WordPressXF.Utils; 5 | using Xamarin.Forms; 6 | 7 | namespace WordPressXF.Converters 8 | { 9 | public class HtmlConverter : IValueConverter 10 | { 11 | public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 12 | { 13 | if (value is string) 14 | { 15 | return HtmlTools.Strip(WebUtility.HtmlDecode(value.ToString())); 16 | } 17 | 18 | return string.Empty; 19 | } 20 | 21 | public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 22 | { 23 | if (value is string) 24 | { 25 | return WebUtility.HtmlEncode(value.ToString()); 26 | } 27 | 28 | return string.Empty; 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/Converters/HtmlWebviewConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Globalization; 3 | using WordPressPCL.Models; 4 | using WordPressXF.Utils; 5 | using Xamarin.Forms; 6 | 7 | namespace WordPressXF.Converters 8 | { 9 | public class HtmlWebviewConverter : IValueConverter 10 | { 11 | public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 12 | { 13 | if (value is Post post) 14 | return new HtmlWebViewSource { Html = HtmlTools.WrapContent(post) }; 15 | 16 | return string.Empty; 17 | } 18 | 19 | public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 20 | { 21 | throw new NotImplementedException(); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/Converters/ImageResourceConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Globalization; 3 | using Xamarin.Forms; 4 | 5 | namespace WordPressXF.Converters 6 | { 7 | public class ImageResourceConverter : IValueConverter 8 | { 9 | public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 10 | { 11 | if (value is string) 12 | { 13 | return ImageSource.FromResource(value.ToString()); 14 | } 15 | 16 | return string.Empty; 17 | } 18 | 19 | public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 20 | { 21 | throw new NotImplementedException(); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/Converters/ImageSourceConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Globalization; 3 | using Xamarin.Forms; 4 | 5 | namespace WordPressXF.Converters 6 | { 7 | public class ImageSourceConverter : IValueConverter 8 | { 9 | public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 10 | { 11 | var imagePath = value as string; 12 | if (string.IsNullOrEmpty(imagePath)) 13 | return null; 14 | 15 | var resource = ImageSource.FromResource(imagePath); 16 | return resource; 17 | } 18 | 19 | public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 20 | { 21 | throw new NotImplementedException(); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/Converters/NullOrEmptyListToIsVisibleConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using System.Globalization; 4 | using Xamarin.Forms; 5 | 6 | namespace WordPressXF.Converters 7 | { 8 | public class NullOrEmptyListToIsVisibleConverter : IValueConverter 9 | { 10 | public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 11 | { 12 | switch (value) 13 | { 14 | case null: 15 | return parameter == null; 16 | case IList list: 17 | return list.Count == 0; 18 | default: 19 | return false; 20 | } 21 | } 22 | 23 | public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 24 | { 25 | throw new NotImplementedException(); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/Converters/SelectedItemConverter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Globalization; 3 | using Xamarin.Forms; 4 | 5 | namespace WordPressXF.Converters 6 | { 7 | public class SelectedItemConverter : IValueConverter 8 | { 9 | public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 10 | { 11 | if (!(value is SelectedItemChangedEventArgs eventArgs)) 12 | return null; 13 | 14 | return eventArgs.SelectedItem; 15 | } 16 | 17 | public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 18 | { 19 | throw new NotImplementedException(); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/ExtensionMethods/EnumerableExtensions.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Collections.ObjectModel; 3 | 4 | namespace WordPressXF.ExtensionMethods 5 | { 6 | public static class EnumerableExtensions 7 | { 8 | public static ObservableCollection ToObservableCollection(this IEnumerable collection) 9 | { 10 | return collection == null ? new ObservableCollection() : new ObservableCollection(collection); 11 | } 12 | 13 | public static void AddRange(this IList list, IEnumerable collection) 14 | { 15 | foreach (var item in collection) 16 | list.Add(item); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/Extensions/TranslateExtension.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Globalization; 3 | using System.Reflection; 4 | using System.Resources; 5 | using Xamarin.Forms; 6 | using Xamarin.Forms.Xaml; 7 | 8 | namespace WordPressXF.Extensions 9 | { 10 | [ContentProperty("Text")] 11 | public class TranslateExtension : IMarkupExtension 12 | { 13 | private readonly CultureInfo _ci; 14 | private const string ResourceId = "WordPressXF.Resources.AppResources"; 15 | 16 | private static readonly Lazy ResMgr = 17 | new Lazy(() => new ResourceManager(ResourceId, typeof(TranslateExtension).GetTypeInfo().Assembly)); 18 | 19 | public TranslateExtension() 20 | { 21 | _ci = new CultureInfo("en-US"); 22 | } 23 | 24 | public string Text { get; set; } 25 | 26 | public object ProvideValue(IServiceProvider serviceProvider) 27 | { 28 | if (Text == null) 29 | return ""; 30 | 31 | return ResMgr.Value.GetString(Text, _ci) ?? Text; 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/Init/Bootstrapper.cs: -------------------------------------------------------------------------------- 1 | using CommonServiceLocator; 2 | using Unity; 3 | using Unity.Lifetime; 4 | using Unity.ServiceLocation; 5 | using WordPressXF.Services; 6 | using WordPressXF.ViewModels; 7 | 8 | namespace WordPressXF.Init 9 | { 10 | public static class Bootstrapper 11 | { 12 | public static void RegisterDependencies() 13 | { 14 | var container = new UnityContainer(); 15 | 16 | // service 17 | container.RegisterType(new ContainerControlledLifetimeManager()); 18 | 19 | // viewmodel 20 | container.RegisterType(new ContainerControlledLifetimeManager()); 21 | container.RegisterType(new ContainerControlledLifetimeManager()); 22 | 23 | var locator = new UnityServiceLocator(container); 24 | ServiceLocator.SetLocatorProvider(() => locator); 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/Interfaces/ISupportIncrementalLoading.cs: -------------------------------------------------------------------------------- 1 | using System.Windows.Input; 2 | 3 | namespace WordPressXF.Interfaces 4 | { 5 | public interface ISupportIncrementalLoading 6 | { 7 | int PageSize { get; set; } 8 | bool IsIncrementalLoading { get; set; } 9 | bool HasMoreItems { get; set; } 10 | ICommand LoadMoreItemsCommand { get; } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/Resources/AppResources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace WordPressXF.Resources { 12 | using System; 13 | 14 | 15 | /// 16 | /// A strongly-typed resource class, for looking up localized strings, etc. 17 | /// 18 | // This class was auto-generated by the StronglyTypedResourceBuilder 19 | // class via a tool like ResGen or Visual Studio. 20 | // To add or remove a member, edit your .ResX file then rerun ResGen 21 | // with the /str option, or rebuild your VS project. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class AppResources { 26 | 27 | private static global::System.Resources.ResourceManager resourceMan; 28 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; 30 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 32 | internal AppResources() { 33 | } 34 | 35 | /// 36 | /// Returns the cached ResourceManager instance used by this class. 37 | /// 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 39 | internal static global::System.Resources.ResourceManager ResourceManager { 40 | get { 41 | if (object.ReferenceEquals(resourceMan, null)) { 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("WordPressXF.Resources.AppResources", typeof(AppResources).Assembly); 43 | resourceMan = temp; 44 | } 45 | return resourceMan; 46 | } 47 | } 48 | 49 | /// 50 | /// Overrides the current thread's CurrentUICulture property for all 51 | /// resource lookups using this strongly typed resource class. 52 | /// 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 54 | internal static global::System.Globalization.CultureInfo Culture { 55 | get { 56 | return resourceCulture; 57 | } 58 | set { 59 | resourceCulture = value; 60 | } 61 | } 62 | 63 | /// 64 | /// Looks up a localized string similar to You have to login first to be able to post a comment.. 65 | /// 66 | internal static string CommentDialogNotAuthorizedMessage { 67 | get { 68 | return ResourceManager.GetString("CommentDialogNotAuthorizedMessage", resourceCulture); 69 | } 70 | } 71 | 72 | /// 73 | /// Looks up a localized string similar to Error. 74 | /// 75 | internal static string CommentDialogNotAuthorizedTitle { 76 | get { 77 | return ResourceManager.GetString("CommentDialogNotAuthorizedTitle", resourceCulture); 78 | } 79 | } 80 | 81 | /// 82 | /// Looks up a localized string similar to Send. 83 | /// 84 | internal static string CommentPageCommentButton { 85 | get { 86 | return ResourceManager.GetString("CommentPageCommentButton", resourceCulture); 87 | } 88 | } 89 | 90 | /// 91 | /// Looks up a localized string similar to Your Comment.... 92 | /// 93 | internal static string CommentPageCommentLabelPlaceholder { 94 | get { 95 | return ResourceManager.GetString("CommentPageCommentLabelPlaceholder", resourceCulture); 96 | } 97 | } 98 | 99 | /// 100 | /// Looks up a localized string similar to Currently there are no comments for this post.. 101 | /// 102 | internal static string CommentPageNoCommentsLabel { 103 | get { 104 | return ResourceManager.GetString("CommentPageNoCommentsLabel", resourceCulture); 105 | } 106 | } 107 | 108 | /// 109 | /// Looks up a localized string similar to Comments. 110 | /// 111 | internal static string CommentPageTitle { 112 | get { 113 | return ResourceManager.GetString("CommentPageTitle", resourceCulture); 114 | } 115 | } 116 | 117 | /// 118 | /// Looks up a localized string similar to Ok. 119 | /// 120 | internal static string DialogOk { 121 | get { 122 | return ResourceManager.GetString("DialogOk", resourceCulture); 123 | } 124 | } 125 | 126 | /// 127 | /// Looks up a localized string similar to Current User:. 128 | /// 129 | internal static string LoginPageCurrentUserLabel { 130 | get { 131 | return ResourceManager.GetString("LoginPageCurrentUserLabel", resourceCulture); 132 | } 133 | } 134 | 135 | /// 136 | /// Looks up a localized string similar to Login. 137 | /// 138 | internal static string LoginPageLoginButton { 139 | get { 140 | return ResourceManager.GetString("LoginPageLoginButton", resourceCulture); 141 | } 142 | } 143 | 144 | /// 145 | /// Looks up a localized string similar to Logout. 146 | /// 147 | internal static string LoginPageLogoutButton { 148 | get { 149 | return ResourceManager.GetString("LoginPageLogoutButton", resourceCulture); 150 | } 151 | } 152 | 153 | /// 154 | /// Looks up a localized string similar to Password. 155 | /// 156 | internal static string LoginPagePasswordPlaceholder { 157 | get { 158 | return ResourceManager.GetString("LoginPagePasswordPlaceholder", resourceCulture); 159 | } 160 | } 161 | 162 | /// 163 | /// Looks up a localized string similar to Login. 164 | /// 165 | internal static string LoginPageTitle { 166 | get { 167 | return ResourceManager.GetString("LoginPageTitle", resourceCulture); 168 | } 169 | } 170 | 171 | /// 172 | /// Looks up a localized string similar to Username. 173 | /// 174 | internal static string LoginPageUsernamePlaceholder { 175 | get { 176 | return ResourceManager.GetString("LoginPageUsernamePlaceholder", resourceCulture); 177 | } 178 | } 179 | 180 | /// 181 | /// Looks up a localized string similar to Post. 182 | /// 183 | internal static string NewsDetailPageTitle { 184 | get { 185 | return ResourceManager.GetString("NewsDetailPageTitle", resourceCulture); 186 | } 187 | } 188 | 189 | /// 190 | /// Looks up a localized string similar to Currently there are no posts to display. Please use 'Pull-To-Refresh' to get the latest news.. 191 | /// 192 | internal static string NewsOverviewPageNoPostsLabel { 193 | get { 194 | return ResourceManager.GetString("NewsOverviewPageNoPostsLabel", resourceCulture); 195 | } 196 | } 197 | 198 | /// 199 | /// Looks up a localized string similar to Settings. 200 | /// 201 | internal static string SettingsPageTitle { 202 | get { 203 | return ResourceManager.GetString("SettingsPageTitle", resourceCulture); 204 | } 205 | } 206 | 207 | /// 208 | /// Looks up a localized string similar to Loading latest posts.... 209 | /// 210 | internal static string SplashScreenLoadingLabel { 211 | get { 212 | return ResourceManager.GetString("SplashScreenLoadingLabel", resourceCulture); 213 | } 214 | } 215 | } 216 | } 217 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/Resources/AppResources.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | You have to login first to be able to post a comment. 122 | 123 | 124 | Error 125 | 126 | 127 | Send 128 | 129 | 130 | Your Comment... 131 | 132 | 133 | Currently there are no comments for this post. 134 | 135 | 136 | Comments 137 | 138 | 139 | Ok 140 | 141 | 142 | Current User: 143 | 144 | 145 | Login 146 | 147 | 148 | Logout 149 | 150 | 151 | Password 152 | 153 | 154 | Login 155 | 156 | 157 | Username 158 | 159 | 160 | Post 161 | 162 | 163 | Currently there are no posts to display. Please use 'Pull-To-Refresh' to get the latest news. 164 | 165 | 166 | Settings 167 | 168 | 169 | Loading latest posts... 170 | 171 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/Services/WordpressService.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Threading.Tasks; 3 | using WordPressPCL; 4 | using WordPressPCL.Models; 5 | using WordPressPCL.Utility; 6 | using WordPressXF.Utils; 7 | using Xamarin.Auth; 8 | 9 | namespace WordPressXF.Services 10 | { 11 | public class WordpressService 12 | { 13 | private readonly WordPressClient _client; 14 | 15 | public WordpressService() 16 | { 17 | _client = new WordPressClient(Statics.WordpressUrl); 18 | } 19 | 20 | public async Task> GetLatestPostsAsync(int page = 0, int perPage = 20) 21 | { 22 | page++; 23 | 24 | var posts = await _client.Posts.Query(new PostsQueryBuilder 25 | { 26 | Page = page, 27 | PerPage = perPage, 28 | Embed = true 29 | }); 30 | 31 | return posts; 32 | } 33 | 34 | public async Task> GetCommentsForPostAsync(int postid) 35 | { 36 | var comments = await _client.Comments.Query(new CommentsQueryBuilder 37 | { 38 | Posts = new[] { postid }, 39 | Page = 1, 40 | PerPage = 100 41 | }); 42 | 43 | return ThreadedCommentsHelper.GetThreadedComments(comments); 44 | } 45 | 46 | public async Task LoginAsync(string username, string password) 47 | { 48 | _client.AuthMethod = AuthMethod.JWT; 49 | await _client.RequestJWToken(username, password); 50 | 51 | var isAuthenticated = await _client.IsValidJWToken(); 52 | 53 | if (isAuthenticated) 54 | return await _client.Users.GetCurrentUser(); 55 | 56 | return null; 57 | } 58 | 59 | public void Logout() 60 | { 61 | _client.Logout(); 62 | } 63 | 64 | public async Task IsUserAuthenticatedAsync() 65 | { 66 | return await _client.IsValidJWToken(); 67 | } 68 | 69 | public async Task PostCommentAsync(int postId, string text, int replyTo = 0) 70 | { 71 | var comment = new Comment(postId, text); 72 | if (replyTo != 0) 73 | comment.ParentId = replyTo; 74 | 75 | return await _client.Comments.Create(comment); 76 | } 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/Utils/HtmlTools.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Text; 3 | using System.Text.RegularExpressions; 4 | using WordPressPCL.Models; 5 | 6 | namespace WordPressXF.Utils 7 | { 8 | public static class HtmlTools 9 | { 10 | public static string Strip(string text) 11 | { 12 | return Regex.Replace(text, @"<(.|\n)*?>", string.Empty); 13 | } 14 | 15 | public static string WrapContent(Post post) 16 | { 17 | var sb = new StringBuilder(); 18 | var content = post.Content.Rendered; 19 | 20 | // remove first img from post if there's one 21 | if (post.Embedded.WpFeaturedmedia != null) 22 | { 23 | content = Regex.Replace(content, "^", ""); 25 | } 26 | 27 | sb.Append(""); 28 | sb.Append(""); 29 | sb.Append(""); 32 | sb.Append(""); 33 | 34 | sb.Append(FeaturedImage(post)); 35 | sb.Append($"

{post.Title.Rendered}

"); 36 | 37 | var authors = new List(post.Embedded.Author); 38 | sb.Append($"

{authors[0].Name} | {post.Date}

"); 39 | sb.Append(content); 40 | sb.Append(""); 41 | 42 | return sb.ToString(); 43 | } 44 | 45 | public static string FeaturedImage(Post post) 46 | { 47 | if (post.Embedded.WpFeaturedmedia == null) 48 | return string.Empty; 49 | 50 | var images = new List(post.Embedded.WpFeaturedmedia); 51 | var img = images[0]; 52 | var imgSrc = img.SourceUrl; 53 | 54 | var sb = new StringBuilder(); 55 | sb.Append(""); 64 | 65 | return sb.ToString(); 66 | } 67 | } 68 | } -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/Utils/Statics.cs: -------------------------------------------------------------------------------- 1 | namespace WordPressXF.Utils 2 | { 3 | public static class Statics 4 | { 5 | public static string WordpressUrl = "http://www.example.com/wp-json/"; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/ViewModels/BaseViewModel.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel; 2 | using System.Runtime.CompilerServices; 3 | 4 | namespace WordPressXF.ViewModels 5 | { 6 | public class BaseViewModel : INotifyPropertyChanged 7 | { 8 | private bool _isLoading; 9 | public bool IsLoading 10 | { 11 | get => _isLoading; 12 | set { _isLoading = value; OnPropertyChanged(); } 13 | } 14 | 15 | private bool _isRefreshing; 16 | public bool IsRefreshing 17 | { 18 | get => _isRefreshing; 19 | set { _isRefreshing = value; OnPropertyChanged(); } 20 | } 21 | 22 | 23 | public event PropertyChangedEventHandler PropertyChanged; 24 | 25 | protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 26 | { 27 | PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/ViewModels/NewsViewModel.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Collections.ObjectModel; 4 | using System.Diagnostics; 5 | using System.Linq; 6 | using System.Net; 7 | using System.Threading.Tasks; 8 | using System.Windows.Input; 9 | using WordPressPCL.Models; 10 | using WordPressXF.Common; 11 | using WordPressXF.ExtensionMethods; 12 | using WordPressXF.Interfaces; 13 | using WordPressXF.Resources; 14 | using WordPressXF.Services; 15 | using WordPressXF.Utils; 16 | using WordPressXF.Views; 17 | using Xamarin.Forms; 18 | 19 | namespace WordPressXF.ViewModels 20 | { 21 | public class NewsViewModel : BaseViewModel, ISupportIncrementalLoading 22 | { 23 | private readonly WordpressService _wordpressService; 24 | 25 | private int _currentPage = -1; 26 | 27 | private ObservableCollection _posts = new ObservableCollection(); 28 | public ObservableCollection Posts 29 | { 30 | get => _posts; 31 | set { _posts = value; OnPropertyChanged(); } 32 | } 33 | 34 | private Post _selectedPost; 35 | public Post SelectedPost 36 | { 37 | get => _selectedPost; 38 | set { _selectedPost = value; OnPropertyChanged(); } 39 | } 40 | 41 | private IEnumerable _comments; 42 | public IEnumerable Comments 43 | { 44 | get => _comments; 45 | set { _comments = value; OnPropertyChanged(); } 46 | } 47 | 48 | private string _commentText; 49 | public string CommentText 50 | { 51 | get => _commentText; 52 | set { _commentText = value; OnPropertyChanged(); PostCommentAsyncCommand.RaiseCanExecuteChange(); } 53 | } 54 | 55 | private bool _isCommenting = false; 56 | public bool IsCommenting 57 | { 58 | get => _isCommenting; 59 | set { _isCommenting = value; OnPropertyChanged(); PostCommentAsyncCommand.RaiseCanExecuteChange(); } 60 | } 61 | 62 | private bool _arePostsNotAvailable = true; 63 | public bool ArePostsNotAvailable 64 | { 65 | get => _arePostsNotAvailable; 66 | set { _arePostsNotAvailable = value; OnPropertyChanged(); } 67 | } 68 | 69 | private AsyncRelayCommand _loadPostsAsyncCommand; 70 | public AsyncRelayCommand LoadPostsAsyncCommand => _loadPostsAsyncCommand ?? (_loadPostsAsyncCommand = new AsyncRelayCommand(LoadPostsAsync)); 71 | 72 | private AsyncRelayCommand _postCommentAsyncCommand; 73 | public AsyncRelayCommand PostCommentAsyncCommand => _postCommentAsyncCommand ?? (_postCommentAsyncCommand = new AsyncRelayCommand(PostCommentAsync, CanPostComment)); 74 | 75 | private bool CanPostComment() 76 | { 77 | return (!string.IsNullOrEmpty(CommentText) && !IsCommenting); 78 | } 79 | 80 | private async Task LoadPostsAsync() 81 | { 82 | try 83 | { 84 | IsRefreshing = true; 85 | 86 | _currentPage = 0; 87 | 88 | Posts.Clear(); 89 | 90 | var posts = (await _wordpressService.GetLatestPostsAsync(_currentPage, PageSize)).ToObservableCollection(); 91 | HasMoreItems = posts.Count == PageSize; 92 | 93 | Posts.AddRange(posts); 94 | 95 | ArePostsNotAvailable = !Posts.Any(); 96 | } 97 | catch (Exception ex) 98 | { 99 | Debug.WriteLine($"NewsViewModel | LoadPostsAsync | {ex}"); 100 | } 101 | finally 102 | { 103 | IsRefreshing = false; 104 | } 105 | } 106 | 107 | private async Task PostCommentAsync() 108 | { 109 | try 110 | { 111 | IsCommenting = true; 112 | 113 | if (await _wordpressService.IsUserAuthenticatedAsync()) 114 | { 115 | var comment = await _wordpressService.PostCommentAsync(SelectedPost.Id, CommentText); 116 | if (comment != null) 117 | { 118 | CommentText = null; 119 | await GetCommentsAsync(SelectedPost.Id); 120 | } 121 | } 122 | else 123 | { 124 | await Application.Current.MainPage.DisplayAlert(AppResources.CommentDialogNotAuthorizedTitle, AppResources.CommentDialogNotAuthorizedMessage, AppResources.DialogOk); 125 | } 126 | } 127 | finally 128 | { 129 | IsCommenting = false; 130 | } 131 | } 132 | 133 | private ICommand _selectPostCommand; 134 | public ICommand SelectPostCommand => _selectPostCommand ?? (_selectPostCommand = new Command(SelectPost)); 135 | 136 | public NewsViewModel(WordpressService wordpressService) 137 | { 138 | _wordpressService = wordpressService; 139 | } 140 | 141 | private async void SelectPost(Post post) 142 | { 143 | if (post == null) 144 | return; 145 | 146 | Comments = null; 147 | CommentText = null; 148 | SelectedPost = post; 149 | 150 | await GetCommentsAsync(post.Id); 151 | await ((MasterDetailPage)Application.Current.MainPage).Detail.Navigation.PushAsync(GetTabbedPage()); 152 | } 153 | 154 | private async Task GetCommentsAsync(int postId) 155 | { 156 | IsLoading = true; 157 | 158 | Comments = await _wordpressService.GetCommentsForPostAsync(postId); 159 | 160 | IsLoading = false; 161 | } 162 | 163 | private TabbedPage GetTabbedPage() 164 | { 165 | return new TabbedPage 166 | { 167 | Title = HtmlTools.Strip(WebUtility.HtmlDecode(SelectedPost.Title.Rendered)), 168 | BindingContext = this, 169 | Children = { new NewsDetailPage(), new CommentPage() } 170 | }; 171 | } 172 | 173 | #region ISupportIncrementalLoading members 174 | 175 | public int PageSize { get; set; } = 10; 176 | 177 | private bool _isIncrementalLoading; 178 | public bool IsIncrementalLoading 179 | { 180 | get => _isIncrementalLoading; 181 | set { _isIncrementalLoading = value; OnPropertyChanged(); } 182 | } 183 | 184 | private bool _hasMoreItems = true; 185 | public bool HasMoreItems 186 | { 187 | get => _hasMoreItems; 188 | set { _hasMoreItems = value; OnPropertyChanged(); } 189 | } 190 | 191 | private bool _isLoadingIncrementally; 192 | public bool IsLoadingIncrementally 193 | { 194 | get => _isLoadingIncrementally; 195 | set { _isLoadingIncrementally = value; OnPropertyChanged(); } 196 | } 197 | 198 | private ICommand _loadMoreItemsCommand; 199 | public ICommand LoadMoreItemsCommand => _loadMoreItemsCommand ?? (_loadMoreItemsCommand = new Command(async () => await LoadMoreItemsAsync())); 200 | 201 | private async Task LoadMoreItemsAsync() 202 | { 203 | try 204 | { 205 | IsLoadingIncrementally = true; 206 | 207 | _currentPage++; 208 | 209 | var posts = (await _wordpressService.GetLatestPostsAsync(_currentPage, PageSize)).ToObservableCollection(); 210 | HasMoreItems = posts.Count == PageSize; 211 | 212 | Posts.AddRange(posts); 213 | ArePostsNotAvailable = !Posts.Any(); 214 | } 215 | catch (Exception ex) 216 | { 217 | Debug.WriteLine($"NewsViewModel | LoadMoreItemsAsync | {ex}"); 218 | } 219 | finally 220 | { 221 | IsLoadingIncrementally = false; 222 | } 223 | } 224 | 225 | #endregion 226 | } 227 | } 228 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/ViewModels/SettingsViewModel.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | using System.Threading.Tasks; 4 | using System.Windows.Input; 5 | using WordPressPCL; 6 | using WordPressPCL.Models; 7 | using WordPressXF.Common; 8 | using WordPressXF.Services; 9 | using Xamarin.Auth; 10 | using Xamarin.Forms; 11 | 12 | namespace WordPressXF.ViewModels 13 | { 14 | public class SettingsViewModel : BaseViewModel 15 | { 16 | private readonly WordpressService _wordPressService; 17 | 18 | private bool _isLoggingIn; 19 | public bool IsLoggingIn 20 | { 21 | get => _isLoggingIn; 22 | set { _isLoggingIn = value; OnPropertyChanged(); LoginCommand.ChangeCanExecute(); } 23 | } 24 | 25 | private bool _isAuthenticated; 26 | public bool IsAuthenticated 27 | { 28 | get => _isAuthenticated; 29 | set { _isAuthenticated = value; OnPropertyChanged(); } 30 | } 31 | 32 | private string _userName; 33 | public string UserName 34 | { 35 | get => _userName; 36 | set { _userName = value; OnPropertyChanged(); } 37 | } 38 | 39 | private string _password; 40 | public string Password 41 | { 42 | get => _password; 43 | set { _password = value; OnPropertyChanged(); } 44 | } 45 | 46 | 47 | private User _currentUser; 48 | public User CurrentUser 49 | { 50 | get => _currentUser; 51 | set { _currentUser = value; OnPropertyChanged(); } 52 | } 53 | 54 | public SettingsViewModel(WordpressService wordPressService) 55 | { 56 | _wordPressService = wordPressService; 57 | } 58 | 59 | private AsyncRelayCommand _tryAutoLoginCommand; 60 | public AsyncRelayCommand TryAutoLoginCommand => _tryAutoLoginCommand ?? (_tryAutoLoginCommand = new AsyncRelayCommand(TryAutoLogin)); 61 | 62 | private Command _loginCommand; 63 | public Command LoginCommand => _loginCommand ?? (_loginCommand = new Command(Login, CanLogin)); 64 | 65 | private bool CanLogin() 66 | { 67 | return !IsLoggingIn; 68 | } 69 | 70 | private ICommand _logoutCommand; 71 | public ICommand LogoutCommand => _logoutCommand ?? (_logoutCommand = new Command(Logout)); 72 | 73 | 74 | public async Task TryAutoLogin() 75 | { 76 | var data = (await AccountStore.Create().FindAccountsForServiceAsync("wordpress")).FirstOrDefault(); 77 | 78 | if (data == null) 79 | return; 80 | 81 | var userName = data.Username; 82 | var password = data.Properties["password"]; 83 | 84 | var user = await _wordPressService.LoginAsync(userName, password); 85 | if (user != null) 86 | CurrentUser = user; 87 | } 88 | 89 | public async void Login() 90 | { 91 | 92 | IsLoggingIn = true; 93 | 94 | if (!string.IsNullOrEmpty(UserName) && !string.IsNullOrEmpty(Password)) 95 | { 96 | var user = await _wordPressService.LoginAsync(UserName, Password); 97 | if (user != null) 98 | { 99 | // Store username & JWT token for logging in on next app launch 100 | await AccountStore.Create().SaveAsync(new Account(UserName, new Dictionary { { "password", Password } }), "wordpress"); 101 | CurrentUser = user; 102 | } 103 | } 104 | 105 | IsLoggingIn = false; 106 | } 107 | 108 | 109 | public async void Logout() 110 | { 111 | _wordPressService.Logout(); 112 | CurrentUser = null; 113 | 114 | var data = (await AccountStore.Create().FindAccountsForServiceAsync("wordpress")).FirstOrDefault(); 115 | 116 | if (data == null) 117 | return; 118 | 119 | await AccountStore.Create().DeleteAsync(data, "wordpress"); 120 | } 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/Views/AppShell/AppShellMaster.xaml: -------------------------------------------------------------------------------- 1 |  2 | 9 | 10 | 11 | 12 | WordPressXF.Assets.menuheader.png 13 | 14 | 15 | 16 | 18 | 24 | 25 | 26 | 27 | 28 | 29 | 33 | 34 | 36 | 37 | 38 | 40 | 42 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 54 | 56 | 58 | 59 | 60 | 61 | 69 | 70 | 71 | 78 | 79 | 89 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/Views/AppShell/AppShellMaster.xaml.cs: -------------------------------------------------------------------------------- 1 | using Xamarin.Forms; 2 | using Xamarin.Forms.Xaml; 3 | 4 | namespace WordPressXF.Views.AppShell 5 | { 6 | [XamlCompilation(XamlCompilationOptions.Compile)] 7 | public partial class AppShellMaster : ContentPage 8 | { 9 | public ListView PrimaryListView { get; set; } 10 | public ListView SecondaryListView { get; set; } 11 | 12 | public AppShellMaster() 13 | { 14 | InitializeComponent(); 15 | 16 | if (Device.RuntimePlatform == Device.iOS) 17 | Icon = "hamburger.png"; 18 | 19 | BindingContext = new AppShellMasterViewModel(); 20 | 21 | PrimaryListView = Primary; 22 | SecondaryListView = Secondary; 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/Views/AppShell/AppShellMasterViewModel.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.ObjectModel; 2 | 3 | namespace WordPressXF.Views.AppShell 4 | { 5 | public class AppShellMasterViewModel 6 | { 7 | public ObservableCollection PrimaryMenuItems { get; set; } 8 | public ObservableCollection SecondaryMenuItems { get; set; } 9 | 10 | public AppShellMasterViewModel() 11 | { 12 | PrimaryMenuItems = new ObservableCollection(new[] 13 | { 14 | new AppShellMenuItem { Id = 0, Title = "News", TargetType = typeof(NewsOverviewPage) }, 15 | }); 16 | 17 | SecondaryMenuItems = new ObservableCollection(new[] 18 | { 19 | new AppShellMenuItem { Id = 0, Title = "Settings", TargetType = typeof(SettingsPage) }, 20 | }); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/Views/AppShell/AppShellMenuItem.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace WordPressXF.Views.AppShell 4 | { 5 | public class AppShellMenuItem 6 | { 7 | public int Id { get; set; } 8 | public string Title { get; set; } 9 | public Type TargetType { get; set; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/Views/AppShell/AppShellPage.xaml: -------------------------------------------------------------------------------- 1 |  2 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/Views/AppShell/AppShellPage.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | using Xamarin.Forms; 8 | using Xamarin.Forms.Xaml; 9 | 10 | namespace WordPressXF.Views.AppShell 11 | { 12 | [XamlCompilation(XamlCompilationOptions.Compile)] 13 | public partial class AppShellPage : MasterDetailPage 14 | { 15 | public AppShellPage() 16 | { 17 | InitializeComponent(); 18 | 19 | MasterPage.PrimaryListView.ItemSelected += ListViewOnItemSelected; 20 | MasterPage.SecondaryListView.ItemSelected += ListViewOnItemSelected; 21 | } 22 | 23 | private void ListViewOnItemSelected(object sender, SelectedItemChangedEventArgs e) 24 | { 25 | if (!(e.SelectedItem is AppShellMenuItem item)) 26 | return; 27 | 28 | ((ListView)sender).SelectedItem = null; 29 | 30 | if (item.TargetType == null) 31 | return; 32 | 33 | var page = (Page)Activator.CreateInstance(item.TargetType); 34 | var navigationPage = new NavigationPage(page); 35 | NavigationPage.SetHasNavigationBar(navigationPage, false); 36 | 37 | Detail.Navigation.PushAsync(navigationPage); 38 | IsPresented = false; 39 | } 40 | } 41 | } -------------------------------------------------------------------------------- /WordPressXF/WordPressXF/WordPressXF/Views/CommentPage.xaml: -------------------------------------------------------------------------------- 1 |  2 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 28 | 29 | 30 | 31 | 33 | 34 | 35 | 36 | 37 | 38 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 60 | 61 | 62 | 65 | 66 | 67 | 68 | 69 | 70 | 73 | 74 |