├── .gitignore
├── LICENSE
├── README.md
├── nuget
└── TinyAccountManager.nuspec
└── src
├── TinyAccountManager.Abstraction
├── Account.cs
├── AccountManager.cs
├── IAccountManager.cs
└── TinyAccountManager.Abstraction.csproj
├── TinyAccountManager.Droid
├── AccountManager.cs
├── AndroidAccountManager.cs
├── AndroidAccountManagerPreM.cs
├── Properties
│ └── AssemblyInfo.cs
├── Resources
│ ├── AboutResources.txt
│ └── Resource.Designer.cs
├── TinyAccountManager.Droid.csproj
├── TinyAccountManager.Droid.csproj.bak
└── packages.config
├── TinyAccountManager.Sample
├── Properties
│ └── AssemblyInfo.cs
├── TinyAccountManager.Sample.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
│ ├── TinyAccountManager.Sample.Android.csproj
│ ├── TinyAccountManager.Sample.Android.csproj.bak
│ └── packages.config
├── TinyAccountManager.Sample.UWP
│ ├── App.xaml
│ ├── App.xaml.cs
│ ├── Assets
│ │ ├── LockScreenLogo.scale-100.png
│ │ ├── LockScreenLogo.scale-125.png
│ │ ├── LockScreenLogo.scale-150.png
│ │ ├── LockScreenLogo.scale-200.png
│ │ ├── LockScreenLogo.scale-400.png
│ │ ├── SplashScreen.scale-100.png
│ │ ├── SplashScreen.scale-125.png
│ │ ├── SplashScreen.scale-150.png
│ │ ├── SplashScreen.scale-200.png
│ │ ├── SplashScreen.scale-400.png
│ │ ├── Square150x150Logo.scale-200.png
│ │ ├── Square44x44Logo.scale-100.png
│ │ ├── Square44x44Logo.scale-125.png
│ │ ├── Square44x44Logo.scale-150.png
│ │ ├── Square44x44Logo.scale-200.png
│ │ ├── Square44x44Logo.scale-400.png
│ │ ├── Square44x44Logo.targetsize-16_altform-unplated.png
│ │ ├── Square44x44Logo.targetsize-24_altform-unplated.png
│ │ ├── Square44x44Logo.targetsize-256_altform-unplated.png
│ │ ├── Square44x44Logo.targetsize-32_altform-unplated.png
│ │ ├── Square44x44Logo.targetsize-48_altform-unplated.png
│ │ ├── StoreLogo.png
│ │ ├── Wide310x150Logo.scale-100.png
│ │ ├── Wide310x150Logo.scale-125.png
│ │ ├── Wide310x150Logo.scale-150.png
│ │ ├── Wide310x150Logo.scale-200.png
│ │ └── Wide310x150Logo.scale-400.png
│ ├── MainPage.xaml
│ ├── MainPage.xaml.cs
│ ├── Package.appxmanifest
│ ├── Properties
│ │ ├── AssemblyInfo.cs
│ │ └── Default.rd.xml
│ ├── TinyAccountManager.Sample.UWP.csproj
│ └── project.json
├── TinyAccountManager.Sample.cs
├── TinyAccountManager.Sample.csproj
├── TinyAccountManager.Sample.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
│ ├── TinyAccountManager.Sample.iOS.csproj
│ ├── iTunesArtwork
│ ├── iTunesArtwork@2x
│ └── packages.config
├── TinyAccountManager.Sample
│ ├── App.xaml
│ ├── App.xaml.cs
│ ├── MainPage.xaml
│ ├── MainPage.xaml.cs
│ ├── TinyAccountManager.Sample.projitems
│ └── TinyAccountManager.Sample.shproj
└── packages.config
├── TinyAccountManager.UWP
├── AccountManager.cs
├── Properties
│ ├── AssemblyInfo.cs
│ └── TinyAccountManager.UWP.rd.xml
├── TinyAccountManager.UWP.csproj
└── UWPAccountManager.cs
├── TinyAccountManager.iOS
├── AccountManager.cs
├── Properties
│ └── AssemblyInfo.cs
├── TinyAccountManager.iOS.csproj
├── iOSAccountManager.cs
└── packages.config
└── TinyAccountManager.sln
/.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 Daniel Hindrikes
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 | # Xamarin.Essentials
2 | Xamarin.Essentials will have this functionallity, please take a look at it. But we will continue to maintain TinyAccountMananger for thoose who use it.
3 | https://docs.microsoft.com/en-us/xamarin/essentials/
4 |
5 | # TinyAccountManager
6 | Account manager for Xamarin and UWP. Store account information in your app in a secure way.
7 |
8 | ## Build status
9 | | Platform | Status |
10 | |---|---|
11 | | iOS |
|
12 | | Android |
|
13 | | UWP |
|
14 |
15 | ## Get started
16 | This is as short guide how to get started using TinyAccountManager.
17 |
18 | ### How to install
19 | The easiest way is to install the package from NuGet:
20 |
21 | ```
22 | Install-Package TinyAccountManager
23 | ```
24 |
25 | You should install it on all your platform project and if you have other projects in your solution where you want to access it, you should install it there as well.
26 |
27 | ### How to use
28 | Here is a small get started guide, there are also a sample project if you take a look in the src folder.
29 |
30 | #### Initialization
31 | The first you need to do is to initialize the AccountManager per platform.
32 |
33 | ```csharp
34 | //iOS
35 | TinyAccountManager.iOS.AccountManager.Initialize();
36 |
37 | //Android
38 | TinyAccountManager.Droid.AccountManager.Initialize();
39 |
40 | //UWP
41 | TinyAccountManager.UWP.AccountManager.Initialize();
42 | ```
43 |
44 | #### Save
45 | The only filed that are required is ServiceId.
46 |
47 | ```csharp
48 | var account = new Account()
49 | {
50 | ServiceId = "TinyAccountManagerSample",
51 | Username = "dhindrik"
52 | };
53 |
54 | account.Properties.Add("Password", "MySecretPassword");
55 |
56 | await AccountMananger.Current.Save(account);
57 | ```
58 |
59 | #### Get and Exists
60 | It's recommended that you use Exists before Get, if you using Get and there is no matching account it will throw an exception.
61 | ```csharp
62 | Account account = null;
63 |
64 | var exists = await AccountManager.Current.Exists("TinyAccountManagerSample")
65 |
66 | if(exists)
67 | account = await AccountManager.Current.Get("TinyAccountManagerSample")
68 | ```
69 |
70 | #### Remove
71 | ```csharp
72 | await AccountManager.Current.Remove("TinyAccountManagerSample")
73 | ```
74 |
75 | #### IOC
76 | If you want to use IOC instead of the singleton pattern, you just register the implemenation for each platform with the IAccountManager interface. If you select this way you don't have to run Initialize on each platform
77 |
78 | **iOS:** iOSAccountManager
79 |
80 | **Android:** AndroidAccountManager
81 |
82 | **UWP:** UWPAccountManager
83 |
--------------------------------------------------------------------------------
/nuget/TinyAccountManager.nuspec:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | TinyAccountManager
5 | 1.0.0
6 | Account manager for Xamarin and UWP.
7 | Daniel Hindrikes and Johan Karlsson
8 | Daniel Hindrikes
9 | https://github.com/dhindrik/TinyAccountManager/blob/master/LICENSE
10 | https://github.com/dhindrik/TinyAccountManager
11 |
12 | false
13 |
14 | Account manager for Xamarin and UWP. Store account information in your app in a secure way.
15 |
16 |
17 |
18 |
19 |
20 | xamarin, plugin, windows, android, xamarin.forms, ios
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 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Abstraction/Account.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Text;
4 |
5 | namespace TinyAccountManager.Abstraction
6 | {
7 | public class Account
8 | {
9 | public string ServiceId { get; set; }
10 | public string Username { get; set; }
11 | public Dictionary Properties { get; set; } = new Dictionary();
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Abstraction/AccountManager.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace TinyAccountManager.Abstraction
4 | {
5 | public static class AccountManager
6 | {
7 | public static IAccountManager Current { get; set; }
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Abstraction/IAccountManager.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Text;
4 | using System.Threading.Tasks;
5 |
6 | namespace TinyAccountManager.Abstraction
7 | {
8 | public interface IAccountManager
9 | {
10 | Task Save(Account account);
11 | Task Get(string serviceId);
12 | Task Exists(string serviceId);
13 | Task Remove(string serviceId);
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Abstraction/TinyAccountManager.Abstraction.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | netstandard1.0
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Droid/AccountManager.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 |
6 | using Android.App;
7 | using Android.Content;
8 | using Android.OS;
9 | using Android.Runtime;
10 | using Android.Views;
11 | using Android.Widget;
12 |
13 | namespace TinyAccountManager.Droid
14 | {
15 | public class AccountManager
16 | {
17 | public static void Initialize()
18 | {
19 | if (Build.VERSION.SdkInt >= BuildVersionCodes.M)
20 | Abstraction.AccountManager.Current = new AndroidAccountManager();
21 | else
22 | Abstraction.AccountManager.Current = new AndroidAccountManagerPreM(Application.Context, "AccountManagerSharedPreferences");
23 | }
24 | }
25 | }
--------------------------------------------------------------------------------
/src/TinyAccountManager.Droid/AndroidAccountManager.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 | using Android.App;
7 | using Android.Content;
8 | using Android.OS;
9 | using Android.Runtime;
10 | using Android.Views;
11 | using Android.Widget;
12 | using TinyAccountManager.Abstraction;
13 | using Java.Security;
14 | using Android.Security;
15 | using Android.Security.Keystore;
16 | using Javax.Crypto;
17 | using Javax.Crypto.Spec;
18 | using Newtonsoft.Json;
19 | using System.IO;
20 |
21 | namespace TinyAccountManager.Droid
22 | {
23 | public class AndroidAccountManager : IAccountManager
24 | {
25 | public const string AesMode = "AES/GCM/NoPadding";
26 | public const string KeyStoreType = "AndroidKeyStore";
27 |
28 | private IKey GetKey(string alias)
29 | {
30 |
31 |
32 | var keyStore = KeyStore.GetInstance(KeyStoreType);
33 | keyStore.Load(null);
34 |
35 | if (!keyStore.ContainsAlias(alias))
36 | {
37 | var generator = KeyGenerator.GetInstance(KeyProperties.KeyAlgorithmAes, KeyStoreType);
38 | generator.Init(new KeyGenParameterSpec.Builder(alias, KeyStorePurpose.Encrypt | KeyStorePurpose.Decrypt)
39 | .SetBlockModes(KeyProperties.BlockModeGcm)
40 | .SetEncryptionPaddings(KeyProperties.EncryptionPaddingNone)
41 | .SetRandomizedEncryptionRequired(false)
42 | .Build());
43 |
44 | generator.GenerateKey();
45 | }
46 |
47 | var key = keyStore.GetKey(alias, null);
48 |
49 | return key;
50 | }
51 |
52 |
53 |
54 | public async Task Exists(string serviceId)
55 | {
56 | try
57 | {
58 |
59 | var documentsPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
60 |
61 | var filePath = Path.Combine(documentsPath, serviceId);
62 |
63 | return File.Exists(filePath);
64 | }
65 | catch (Exception)
66 | {
67 | return false;
68 | }
69 | }
70 |
71 | public async Task Get(string serviceId)
72 | {
73 |
74 | var documentsPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
75 |
76 | var filePath = Path.Combine(documentsPath, serviceId);
77 |
78 | var secretAccountJson = File.ReadAllText(filePath);
79 |
80 | var secretAccount = JsonConvert.DeserializeObject(secretAccountJson);
81 |
82 | var key = GetKey(serviceId);
83 |
84 | var cipher = Cipher.GetInstance(AesMode);
85 | cipher.Init(CipherMode.DecryptMode, key, new GCMParameterSpec(128, secretAccount.IV));
86 |
87 | var encryptedBytes = Convert.FromBase64String(secretAccount.EncryptedAccount);
88 |
89 | var decryptedBytes = cipher.DoFinal(encryptedBytes);
90 |
91 | var json = Encoding.UTF8.GetString(decryptedBytes);
92 |
93 | var account = JsonConvert.DeserializeObject(json);
94 |
95 | return account;
96 | }
97 |
98 | public async Task Remove(string serviceId)
99 | {
100 | var documentsPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
101 |
102 | var filePath = Path.Combine(documentsPath, serviceId);
103 |
104 | File.Delete(filePath);
105 | }
106 |
107 | public async Task Save(Account account)
108 | {
109 | if (string.IsNullOrWhiteSpace(account.ServiceId))
110 | {
111 | throw new Exception("serviceId must be set.");
112 | }
113 |
114 | var key = GetKey(account.ServiceId);
115 |
116 | var cipher = Cipher.GetInstance(AesMode);
117 | cipher.Init(CipherMode.EncryptMode, key);
118 |
119 | var iv = cipher.GetIV();
120 |
121 | var json = JsonConvert.SerializeObject(account);
122 |
123 | var bytes = Encoding.UTF8.GetBytes(json);
124 |
125 | var encodedBytes = cipher.DoFinal(bytes);
126 |
127 | var base64String = Convert.ToBase64String(encodedBytes);
128 |
129 | var secretAccount = new SecretAccount()
130 | {
131 | EncryptedAccount = base64String,
132 | IV = iv
133 | };
134 |
135 | var secretAccountJson = JsonConvert.SerializeObject(secretAccount);
136 |
137 | var documentsPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
138 |
139 | var filePath = Path.Combine(documentsPath, account.ServiceId);
140 | System.IO.File.WriteAllText(filePath, secretAccountJson);
141 |
142 | }
143 | }
144 |
145 | internal class SecretAccount
146 | {
147 | public string EncryptedAccount { get; set; }
148 | public byte[] IV { get; set; }
149 | }
150 | }
--------------------------------------------------------------------------------
/src/TinyAccountManager.Droid/AndroidAccountManagerPreM.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.IO;
4 | using System.Linq;
5 | using System.Text;
6 | using System.Threading.Tasks;
7 | using Android.App;
8 | using Android.Content;
9 | using Android.OS;
10 | using Android.Runtime;
11 | using Android.Security;
12 | using Android.Security.Keystore;
13 | using Android.Views;
14 | using Android.Widget;
15 | using Java.IO;
16 | using Java.Math;
17 | using Java.Security;
18 | using Java.Util;
19 | using Javax.Crypto;
20 | using Javax.Crypto.Spec;
21 | using Javax.Security.Auth.X500;
22 | using Newtonsoft.Json;
23 | using TinyAccountManager.Abstraction;
24 | using File = System.IO.File;
25 |
26 | //using Calendar = Android.Icu.Util.Calendar;
27 |
28 | namespace TinyAccountManager.Droid
29 | {
30 | public class AndroidAccountManagerPreM : IAccountManager
31 | {
32 | private const string AndroidKeyStore = "AndroidKeyStore";
33 | private const string RSAMode = "RSA/ECB/PKCS1Padding";
34 | private const string AESMode = "AES/ECB/PKCS7Padding";
35 | private const string EncryptedAESKey = "EncryptedAESKey";
36 |
37 | private readonly Context _context;
38 | private readonly KeyStore _keyStore;
39 | private readonly string _sharedPreferenceName;
40 |
41 | public AndroidAccountManagerPreM(Context context, string sharedPreferenceName)
42 | {
43 | _context = context;
44 | _sharedPreferenceName = sharedPreferenceName;
45 |
46 | _keyStore = KeyStore.GetInstance(AndroidKeyStore);
47 | _keyStore.Load(null);
48 | }
49 |
50 | #region Public members
51 | public async Task Save(Account account)
52 | {
53 | if (string.IsNullOrWhiteSpace(account.ServiceId))
54 | {
55 | throw new Exception("serviceId must be set.");
56 | }
57 |
58 | GenerateAndStoreKey(account.ServiceId);
59 |
60 | var c = Cipher.GetInstance(AESMode, "BC");
61 | c.Init(CipherMode.EncryptMode, GetSecretKey(_context, account.ServiceId));
62 | var iv = c.GetIV();
63 |
64 | var json = JsonConvert.SerializeObject(account);
65 |
66 | var bytes = Encoding.UTF8.GetBytes(json);
67 |
68 | var encodedBytes = c.DoFinal(bytes);
69 |
70 | var base64String = Convert.ToBase64String(encodedBytes);
71 |
72 | var secretAccount = new SecretAccount()
73 | {
74 | EncryptedAccount = base64String,
75 | IV = iv
76 | };
77 |
78 | var secretAccountJson = JsonConvert.SerializeObject(secretAccount);
79 |
80 | var documentsPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
81 |
82 | var filePath = Path.Combine(documentsPath, account.ServiceId);
83 | System.IO.File.WriteAllText(filePath, secretAccountJson);
84 | }
85 |
86 | public async Task Get(string serviceId)
87 | {
88 | var documentsPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
89 |
90 | var filePath = Path.Combine(documentsPath, serviceId);
91 |
92 | var secretAccountJson = File.ReadAllText(filePath);
93 |
94 | var secretAccount = JsonConvert.DeserializeObject(secretAccountJson);
95 |
96 | var cipher = Cipher.GetInstance(AESMode, "BC");
97 | cipher.Init(CipherMode.DecryptMode, GetSecretKey(_context, serviceId));
98 |
99 | var encryptedBytes = Convert.FromBase64String(secretAccount.EncryptedAccount);
100 |
101 | var decryptedBytes = cipher.DoFinal(encryptedBytes);
102 |
103 | var json = Encoding.UTF8.GetString(decryptedBytes);
104 |
105 | var account = JsonConvert.DeserializeObject(json);
106 |
107 | return account;
108 | }
109 |
110 | public async Task Exists(string serviceId)
111 | {
112 | try
113 | {
114 | var documentsPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
115 |
116 | var filePath = Path.Combine(documentsPath, serviceId);
117 |
118 | return File.Exists(filePath);
119 | }
120 | catch (Exception)
121 | {
122 | return false;
123 | }
124 | }
125 |
126 | public async Task Remove(string serviceId)
127 | {
128 | var documentsPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
129 |
130 | var filePath = Path.Combine(documentsPath, serviceId);
131 |
132 | File.Delete(filePath);
133 | }
134 | #endregion
135 |
136 | #region Private members
137 |
138 | private IKey GetSecretKey(Context context, string keyAlias)
139 | {
140 | var pref = context.GetSharedPreferences(_sharedPreferenceName, FileCreationMode.Private);
141 | var enryptedKeyB64 = pref.GetString(EncryptedAESKey, null);
142 | // need to check null, omitted here
143 | var encryptedKey = Convert.FromBase64String(enryptedKeyB64);
144 | var key = RSADecrypt(encryptedKey, keyAlias);
145 | return new SecretKeySpec(key, "AES");
146 | }
147 |
148 |
149 | private void GenerateAndStoreKey(string keyAlias)
150 | {
151 | var pref = _context.GetSharedPreferences(_sharedPreferenceName, FileCreationMode.Private);
152 | var enryptedKeyB64 = pref.GetString(EncryptedAESKey, null);
153 | if (string.IsNullOrWhiteSpace(enryptedKeyB64))
154 | {
155 | var key = new byte[16];
156 | var secureRandom = new SecureRandom();
157 | secureRandom.NextBytes(key);
158 | var encryptedKey = RSAEncrypt(key, keyAlias);
159 | enryptedKeyB64 = Convert.ToBase64String(encryptedKey);
160 | var edit = pref.Edit();
161 | edit.PutString(EncryptedAESKey, enryptedKeyB64);
162 | edit.Commit();
163 | }
164 | }
165 |
166 | private void GenerateRSAKeyPairs(string alias)
167 | {
168 | // Generate the RSA key pairs
169 | if (!_keyStore.ContainsAlias(alias))
170 | {
171 | // Generate a key pair for encryption
172 | var start = Calendar.GetInstance(Locale.English);
173 | var end = Calendar.GetInstance(Locale.English);
174 | end.Add(CalendarField.Year, 30);
175 | var spec = new KeyPairGeneratorSpec.Builder(_context)
176 | .SetAlias(alias)
177 | .SetSubject(new X500Principal("CN=" + alias))
178 | .SetSerialNumber(BigInteger.Ten)
179 | .SetStartDate(start.Time)
180 | .SetEndDate(end.Time)
181 | .Build();
182 | var kpg = KeyPairGenerator.GetInstance(KeyProperties.KeyAlgorithmRsa, AndroidKeyStore);
183 | kpg.Initialize(spec);
184 | kpg.GenerateKeyPair();
185 | }
186 | }
187 |
188 | private byte[] RSAEncrypt(byte[] secret, string keyAlias)
189 | {
190 | var privateKeyEntry = (KeyStore.PrivateKeyEntry)_keyStore.GetEntry(keyAlias, null);
191 |
192 | if (privateKeyEntry == null)
193 | {
194 | GenerateRSAKeyPairs(keyAlias);
195 | privateKeyEntry = (KeyStore.PrivateKeyEntry)_keyStore.GetEntry(keyAlias, null);
196 | }
197 |
198 | // Encrypt the text
199 | var cipher = Cipher.GetInstance(RSAMode, "AndroidOpenSSL");
200 | cipher.Init(CipherMode.EncryptMode, privateKeyEntry.Certificate.PublicKey);
201 |
202 | return cipher.DoFinal(secret);
203 | }
204 |
205 | private byte[] RSADecrypt(byte[] encrypted, string keyAlias)
206 | {
207 | var privateKeyEntry = (KeyStore.PrivateKeyEntry)_keyStore.GetEntry(keyAlias, null);
208 | var cipher = Cipher.GetInstance(RSAMode, "AndroidOpenSSL");
209 | cipher.Init(CipherMode.DecryptMode, privateKeyEntry.PrivateKey);
210 |
211 | return cipher.DoFinal(encrypted);
212 | }
213 |
214 | #endregion
215 | }
216 | }
--------------------------------------------------------------------------------
/src/TinyAccountManager.Droid/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("TinyAccountManager.Droid")]
10 | [assembly: AssemblyDescription("")]
11 | [assembly: AssemblyConfiguration("")]
12 | [assembly: AssemblyCompany("")]
13 | [assembly: AssemblyProduct("TinyAccountManager.Droid")]
14 | [assembly: AssemblyCopyright("Copyright © 2017")]
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 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Droid/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.axml),
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/
12 | icon.png
13 |
14 | layout/
15 | main.axml
16 |
17 | values/
18 | strings.xml
19 |
20 | In order to get the build system to recognize Android resources, set the build action to
21 | "AndroidResource". The native Android APIs do not operate directly with filenames, but
22 | instead operate on resource IDs. When you compile an Android application that uses resources,
23 | the build system will package the resources for distribution and generate a class called "R"
24 | (this is an Android convention) that contains the tokens for each one of the resources
25 | included. For example, for the above Resources layout, this is what the R class would expose:
26 |
27 | public class R {
28 | public class drawable {
29 | public const int icon = 0x123;
30 | }
31 |
32 | public class layout {
33 | public const int main = 0x456;
34 | }
35 |
36 | public class strings {
37 | public const int first_string = 0xabc;
38 | public const int second_string = 0xbcd;
39 | }
40 | }
41 |
42 | You would then use R.drawable.icon to reference the drawable/icon.png file, or R.layout.main
43 | to reference the layout/main.axml file, or R.strings.first_string to reference the first
44 | string in the dictionary file values/strings.xml.
--------------------------------------------------------------------------------
/src/TinyAccountManager.Droid/Resources/Resource.Designer.cs:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Droid/Resources/Resource.Designer.cs
--------------------------------------------------------------------------------
/src/TinyAccountManager.Droid/TinyAccountManager.Droid.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Debug
5 | AnyCPU
6 | 8.0.30703
7 | 2.0
8 | {FAF32095-2542-4068-B4EE-20786357CDB4}
9 | {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
10 | Library
11 | Properties
12 | TinyAccountManager.Droid
13 | TinyAccountManager.Droid
14 | 512
15 | Resources\Resource.Designer.cs
16 | Off
17 | True
18 | v8.1
19 |
20 |
21 | true
22 | full
23 | false
24 | bin\Debug\
25 | DEBUG;TRACE
26 | prompt
27 | 4
28 |
29 |
30 | pdbonly
31 | true
32 | bin\Release\
33 | TRACE
34 | prompt
35 | 4
36 |
37 |
38 |
39 |
40 |
41 |
42 | ..\packages\Newtonsoft.Json.10.0.3\lib\netstandard1.3\Newtonsoft.Json.dll
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 | {e8eb6ee2-30fc-4bc3-ae8c-4160172a714c}
65 | TinyAccountManager.Abstraction
66 |
67 |
68 |
69 |
76 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Droid/TinyAccountManager.Droid.csproj.bak:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Debug
5 | AnyCPU
6 | 8.0.30703
7 | 2.0
8 | {FAF32095-2542-4068-B4EE-20786357CDB4}
9 | {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
10 | Library
11 | Properties
12 | TinyAccountManager.Droid
13 | TinyAccountManager.Droid
14 | 512
15 | Resources\Resource.Designer.cs
16 | Off
17 | True
18 | v8.0
19 |
20 |
21 | true
22 | full
23 | false
24 | bin\Debug\
25 | DEBUG;TRACE
26 | prompt
27 | 4
28 |
29 |
30 | pdbonly
31 | true
32 | bin\Release\
33 | TRACE
34 | prompt
35 | 4
36 |
37 |
38 |
39 |
40 |
41 |
42 | ..\packages\Newtonsoft.Json.10.0.3\lib\netstandard1.3\Newtonsoft.Json.dll
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 | {e8eb6ee2-30fc-4bc3-ae8c-4160172a714c}
64 | TinyAccountManager.Abstraction
65 |
66 |
67 |
68 |
75 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Droid/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 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Resources;
2 | using System.Reflection;
3 | using System.Runtime.CompilerServices;
4 | using System.Runtime.InteropServices;
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("TinyAccountManager.Sample")]
10 | [assembly: AssemblyDescription("")]
11 | [assembly: AssemblyConfiguration("")]
12 | [assembly: AssemblyCompany("")]
13 | [assembly: AssemblyProduct("TinyAccountManager.Sample")]
14 | [assembly: AssemblyCopyright("Copyright © 2014")]
15 | [assembly: AssemblyTrademark("")]
16 | [assembly: AssemblyCulture("")]
17 | [assembly: NeutralResourcesLanguage("en")]
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 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.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 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.Android/MainActivity.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | using Android.App;
4 | using Android.Content.PM;
5 | using Android.Runtime;
6 | using Android.Views;
7 | using Android.Widget;
8 | using Android.OS;
9 |
10 | namespace TinyAccountManager.Sample.Droid
11 | {
12 | [Activity (Label = "TinyAccountManager.Sample", Icon = "@drawable/icon", Theme="@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
13 | public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
14 | {
15 | protected override void OnCreate (Bundle bundle)
16 | {
17 | TabLayoutResource = Resource.Layout.Tabbar;
18 | ToolbarResource = Resource.Layout.Toolbar;
19 |
20 | TinyAccountManager.Droid.AccountManager.Initialize();
21 |
22 |
23 | base.OnCreate (bundle);
24 |
25 | global::Xamarin.Forms.Forms.Init (this, bundle);
26 | LoadApplication (new TinyAccountManager.Sample.App ());
27 | }
28 | }
29 | }
30 |
31 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.Android/Properties/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.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("TinyAccountManager.Sample.Android")]
10 | [assembly: AssemblyDescription("")]
11 | [assembly: AssemblyConfiguration("")]
12 | [assembly: AssemblyCompany("")]
13 | [assembly: AssemblyProduct("TinyAccountManager.Sample.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 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.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 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.Android/Resources/drawable-hdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.Android/Resources/drawable-hdpi/icon.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.Android/Resources/drawable-xhdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.Android/Resources/drawable-xhdpi/icon.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.Android/Resources/drawable-xxhdpi/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.Android/Resources/drawable-xxhdpi/icon.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.Android/Resources/drawable/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.Android/Resources/drawable/icon.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.Android/Resources/layout/Tabbar.axml:
--------------------------------------------------------------------------------
1 |
2 |
12 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.Android/Resources/layout/Toolbar.axml:
--------------------------------------------------------------------------------
1 |
9 |
10 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.Android/Resources/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 |
26 |
27 |
30 |
31 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.Android/TinyAccountManager.Sample.Android.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | AnyCPU
7 | 8.0.30703
8 | 2.0
9 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}
10 | {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
11 | Library
12 | Properties
13 | TinyAccountManager.Sample.Droid
14 | TinyAccountManager.Sample.Android
15 | 512
16 | true
17 | Resources\Resource.Designer.cs
18 | Off
19 | Properties\AndroidManifest.xml
20 | true
21 | v8.1
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 | true
31 | full
32 | false
33 | bin\Debug\
34 | DEBUG;TRACE
35 | prompt
36 | 4
37 | True
38 | None
39 | armeabi,armeabi-v7a,x86
40 |
41 |
42 | pdbonly
43 | true
44 | bin\Release\
45 | TRACE
46 | prompt
47 | 4
48 | False
49 | SdkOnly
50 |
51 |
52 |
53 | ..\..\packages\Xamarin.Forms.2.4.0.280\lib\MonoAndroid10\FormsViewGroup.dll
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 | ..\..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Animated.Vector.Drawable.dll
63 |
64 |
65 | ..\..\packages\Xamarin.Android.Support.Annotations.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Annotations.dll
66 |
67 |
68 | ..\..\packages\Xamarin.Android.Support.Compat.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Compat.dll
69 |
70 |
71 | ..\..\packages\Xamarin.Android.Support.Core.UI.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Core.UI.dll
72 |
73 |
74 | ..\..\packages\Xamarin.Android.Support.Core.Utils.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Core.Utils.dll
75 |
76 |
77 | ..\..\packages\Xamarin.Android.Support.Design.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Design.dll
78 |
79 |
80 | ..\..\packages\Xamarin.Android.Support.Fragment.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Fragment.dll
81 |
82 |
83 | ..\..\packages\Xamarin.Android.Support.Media.Compat.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Media.Compat.dll
84 |
85 |
86 | ..\..\packages\Xamarin.Android.Support.v4.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v4.dll
87 |
88 |
89 | ..\..\packages\Xamarin.Android.Support.v7.AppCompat.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v7.AppCompat.dll
90 |
91 |
92 | ..\..\packages\Xamarin.Android.Support.v7.CardView.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v7.CardView.dll
93 |
94 |
95 | ..\..\packages\Xamarin.Android.Support.v7.MediaRouter.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v7.MediaRouter.dll
96 |
97 |
98 | ..\..\packages\Xamarin.Android.Support.v7.RecyclerView.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v7.RecyclerView.dll
99 |
100 |
101 | ..\..\packages\Xamarin.Android.Support.Vector.Drawable.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Vector.Drawable.dll
102 |
103 |
104 | ..\..\packages\Xamarin.Forms.2.4.0.280\lib\MonoAndroid10\Xamarin.Forms.Core.dll
105 |
106 |
107 | ..\..\packages\Xamarin.Forms.2.4.0.280\lib\MonoAndroid10\Xamarin.Forms.Platform.dll
108 |
109 |
110 | ..\..\packages\Xamarin.Forms.2.4.0.280\lib\MonoAndroid10\Xamarin.Forms.Platform.Android.dll
111 |
112 |
113 | ..\..\packages\Xamarin.Forms.2.4.0.280\lib\MonoAndroid10\Xamarin.Forms.Xaml.dll
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 | {e8eb6ee2-30fc-4bc3-ae8c-4160172a714c}
140 | TinyAccountManager.Abstraction
141 |
142 |
143 | {faf32095-2542-4068-b4ee-20786357cdb4}
144 | TinyAccountManager.Droid
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 | 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}.
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
190 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.Android/TinyAccountManager.Sample.Android.csproj.bak:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | AnyCPU
7 | 8.0.30703
8 | 2.0
9 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}
10 | {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
11 | Library
12 | Properties
13 | TinyAccountManager.Sample.Droid
14 | TinyAccountManager.Sample.Android
15 | 512
16 | true
17 | Resources\Resource.Designer.cs
18 | Off
19 | Properties\AndroidManifest.xml
20 | true
21 | v8.0
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 | true
31 | full
32 | false
33 | bin\Debug\
34 | DEBUG;TRACE
35 | prompt
36 | 4
37 | True
38 | None
39 | armeabi,armeabi-v7a,x86
40 |
41 |
42 | pdbonly
43 | true
44 | bin\Release\
45 | TRACE
46 | prompt
47 | 4
48 | False
49 | SdkOnly
50 |
51 |
52 |
53 | ..\..\packages\Xamarin.Forms.2.4.0.280\lib\MonoAndroid10\FormsViewGroup.dll
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 | ..\..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Animated.Vector.Drawable.dll
63 |
64 |
65 | ..\..\packages\Xamarin.Android.Support.Annotations.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Annotations.dll
66 |
67 |
68 | ..\..\packages\Xamarin.Android.Support.Compat.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Compat.dll
69 |
70 |
71 | ..\..\packages\Xamarin.Android.Support.Core.UI.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Core.UI.dll
72 |
73 |
74 | ..\..\packages\Xamarin.Android.Support.Core.Utils.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Core.Utils.dll
75 |
76 |
77 | ..\..\packages\Xamarin.Android.Support.Design.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Design.dll
78 |
79 |
80 | ..\..\packages\Xamarin.Android.Support.Fragment.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Fragment.dll
81 |
82 |
83 | ..\..\packages\Xamarin.Android.Support.Media.Compat.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Media.Compat.dll
84 |
85 |
86 | ..\..\packages\Xamarin.Android.Support.v4.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v4.dll
87 |
88 |
89 | ..\..\packages\Xamarin.Android.Support.v7.AppCompat.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v7.AppCompat.dll
90 |
91 |
92 | ..\..\packages\Xamarin.Android.Support.v7.CardView.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v7.CardView.dll
93 |
94 |
95 | ..\..\packages\Xamarin.Android.Support.v7.MediaRouter.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v7.MediaRouter.dll
96 |
97 |
98 | ..\..\packages\Xamarin.Android.Support.v7.RecyclerView.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v7.RecyclerView.dll
99 |
100 |
101 | ..\..\packages\Xamarin.Android.Support.Vector.Drawable.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Vector.Drawable.dll
102 |
103 |
104 | ..\..\packages\Xamarin.Forms.2.4.0.280\lib\MonoAndroid10\Xamarin.Forms.Core.dll
105 |
106 |
107 | ..\..\packages\Xamarin.Forms.2.4.0.280\lib\MonoAndroid10\Xamarin.Forms.Platform.dll
108 |
109 |
110 | ..\..\packages\Xamarin.Forms.2.4.0.280\lib\MonoAndroid10\Xamarin.Forms.Platform.Android.dll
111 |
112 |
113 | ..\..\packages\Xamarin.Forms.2.4.0.280\lib\MonoAndroid10\Xamarin.Forms.Xaml.dll
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 | {e8eb6ee2-30fc-4bc3-ae8c-4160172a714c}
140 | TinyAccountManager.Abstraction
141 |
142 |
143 | {faf32095-2542-4068-b4ee-20786357cdb4}
144 | TinyAccountManager.Droid
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 | 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}.
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
190 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.Android/packages.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/App.xaml:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/App.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.IO;
4 | using System.Linq;
5 | using System.Runtime.InteropServices.WindowsRuntime;
6 | using Windows.ApplicationModel;
7 | using Windows.ApplicationModel.Activation;
8 | using Windows.Foundation;
9 | using Windows.Foundation.Collections;
10 | using Windows.UI.Xaml;
11 | using Windows.UI.Xaml.Controls;
12 | using Windows.UI.Xaml.Controls.Primitives;
13 | using Windows.UI.Xaml.Data;
14 | using Windows.UI.Xaml.Input;
15 | using Windows.UI.Xaml.Media;
16 | using Windows.UI.Xaml.Navigation;
17 |
18 | namespace TinyAccountManager.Sample.UWP
19 | {
20 | ///
21 | /// Provides application-specific behavior to supplement the default Application class.
22 | ///
23 | sealed partial class App : Application
24 | {
25 | ///
26 | /// Initializes the singleton application object. This is the first line of authored code
27 | /// executed, and as such is the logical equivalent of main() or WinMain().
28 | ///
29 | public App()
30 | {
31 | this.InitializeComponent();
32 | this.Suspending += OnSuspending;
33 | }
34 |
35 | ///
36 | /// Invoked when the application is launched normally by the end user. Other entry points
37 | /// will be used such as when the application is launched to open a specific file.
38 | ///
39 | /// Details about the launch request and process.
40 | protected override void OnLaunched(LaunchActivatedEventArgs e)
41 | {
42 |
43 | #if DEBUG
44 | if (System.Diagnostics.Debugger.IsAttached)
45 | {
46 | this.DebugSettings.EnableFrameRateCounter = true;
47 | }
48 | #endif
49 |
50 | Frame rootFrame = Window.Current.Content as Frame;
51 |
52 | // Do not repeat app initialization when the Window already has content,
53 | // just ensure that the window is active
54 | if (rootFrame == null)
55 | {
56 | // Create a Frame to act as the navigation context and navigate to the first page
57 | rootFrame = new Frame();
58 |
59 | rootFrame.NavigationFailed += OnNavigationFailed;
60 |
61 | Xamarin.Forms.Forms.Init(e);
62 |
63 | if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
64 | {
65 | //TODO: Load state from previously suspended application
66 | }
67 |
68 | // Place the frame in the current Window
69 | Window.Current.Content = rootFrame;
70 | }
71 |
72 | if (rootFrame.Content == null)
73 | {
74 | // When the navigation stack isn't restored navigate to the first page,
75 | // configuring the new page by passing required information as a navigation
76 | // parameter
77 | rootFrame.Navigate(typeof(MainPage), e.Arguments);
78 | }
79 | // Ensure the current window is active
80 | Window.Current.Activate();
81 | }
82 |
83 | ///
84 | /// Invoked when Navigation to a certain page fails
85 | ///
86 | /// The Frame which failed navigation
87 | /// Details about the navigation failure
88 | void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
89 | {
90 | throw new Exception("Failed to load Page " + e.SourcePageType.FullName);
91 | }
92 |
93 | ///
94 | /// Invoked when application execution is being suspended. Application state is saved
95 | /// without knowing whether the application will be terminated or resumed with the contents
96 | /// of memory still intact.
97 | ///
98 | /// The source of the suspend request.
99 | /// Details about the suspend request.
100 | private void OnSuspending(object sender, SuspendingEventArgs e)
101 | {
102 | var deferral = e.SuspendingOperation.GetDeferral();
103 | //TODO: Save application state and stop any background activity
104 | deferral.Complete();
105 | }
106 | }
107 | }
108 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/LockScreenLogo.scale-100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/LockScreenLogo.scale-100.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/LockScreenLogo.scale-125.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/LockScreenLogo.scale-125.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/LockScreenLogo.scale-150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/LockScreenLogo.scale-150.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/LockScreenLogo.scale-200.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/LockScreenLogo.scale-200.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/LockScreenLogo.scale-400.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/LockScreenLogo.scale-400.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/SplashScreen.scale-100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/SplashScreen.scale-100.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/SplashScreen.scale-125.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/SplashScreen.scale-125.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/SplashScreen.scale-150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/SplashScreen.scale-150.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/SplashScreen.scale-200.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/SplashScreen.scale-200.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/SplashScreen.scale-400.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/SplashScreen.scale-400.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/Square150x150Logo.scale-200.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/Square150x150Logo.scale-200.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/Square44x44Logo.scale-100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/Square44x44Logo.scale-100.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/Square44x44Logo.scale-125.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/Square44x44Logo.scale-125.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/Square44x44Logo.scale-150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/Square44x44Logo.scale-150.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/Square44x44Logo.scale-200.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/Square44x44Logo.scale-200.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/Square44x44Logo.scale-400.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/Square44x44Logo.scale-400.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/Square44x44Logo.targetsize-16_altform-unplated.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/Square44x44Logo.targetsize-16_altform-unplated.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/Square44x44Logo.targetsize-24_altform-unplated.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/Square44x44Logo.targetsize-24_altform-unplated.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/Square44x44Logo.targetsize-256_altform-unplated.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/Square44x44Logo.targetsize-256_altform-unplated.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/Square44x44Logo.targetsize-32_altform-unplated.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/Square44x44Logo.targetsize-32_altform-unplated.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/Square44x44Logo.targetsize-48_altform-unplated.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/Square44x44Logo.targetsize-48_altform-unplated.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/StoreLogo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/StoreLogo.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/Wide310x150Logo.scale-100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/Wide310x150Logo.scale-100.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/Wide310x150Logo.scale-125.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/Wide310x150Logo.scale-125.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/Wide310x150Logo.scale-150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/Wide310x150Logo.scale-150.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/Wide310x150Logo.scale-200.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/Wide310x150Logo.scale-200.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/Wide310x150Logo.scale-400.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Assets/Wide310x150Logo.scale-400.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/MainPage.xaml:
--------------------------------------------------------------------------------
1 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/MainPage.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.IO;
4 | using System.Linq;
5 | using System.Runtime.InteropServices.WindowsRuntime;
6 | using Windows.Foundation;
7 | using Windows.Foundation.Collections;
8 | using Windows.UI.Xaml;
9 | using Windows.UI.Xaml.Controls;
10 | using Windows.UI.Xaml.Controls.Primitives;
11 | using Windows.UI.Xaml.Data;
12 | using Windows.UI.Xaml.Input;
13 | using Windows.UI.Xaml.Media;
14 | using Windows.UI.Xaml.Navigation;
15 | using TinyAccountManager.UWP;
16 |
17 | namespace TinyAccountManager.Sample.UWP
18 | {
19 | public sealed partial class MainPage
20 | {
21 | public MainPage()
22 | {
23 | this.InitializeComponent();
24 |
25 | AccountManager.Initialize();
26 |
27 | LoadApplication(new TinyAccountManager.Sample.App());
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Package.appxmanifest:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
13 |
14 |
15 |
16 |
17 | TinyAccountManager.Sample.UWP
18 | Daniel Hindrikes
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 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.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("TinyAccountManager.Sample.UWP")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("TinyAccountManager.Sample.UWP")]
13 | [assembly: AssemblyCopyright("Copyright © 2015")]
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)]
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/Properties/Default.rd.xml:
--------------------------------------------------------------------------------
1 |
17 |
18 |
19 |
20 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/TinyAccountManager.Sample.UWP.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | x86
7 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}
8 | AppContainerExe
9 | Properties
10 | TinyAccountManager.Sample.UWP
11 | TinyAccountManager.Sample.UWP
12 | en-US
13 | UAP
14 | 10.0.16299.0
15 | 10.0.10240.0
16 | 14
17 | true
18 | 512
19 | {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
20 | TinyAccountManager.Sample.UWP_TemporaryKey.pfx
21 |
22 |
23 | true
24 | bin\ARM\Debug\
25 | DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP
26 | ;2008
27 | full
28 | ARM
29 | false
30 | prompt
31 | true
32 |
33 |
34 | bin\ARM\Release\
35 | TRACE;NETFX_CORE;WINDOWS_UWP
36 | true
37 | ;2008
38 | pdbonly
39 | ARM
40 | false
41 | prompt
42 | true
43 | true
44 |
45 |
46 | true
47 | bin\x64\Debug\
48 | DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP
49 | ;2008
50 | full
51 | x64
52 | false
53 | prompt
54 | true
55 |
56 |
57 | bin\x64\Release\
58 | TRACE;NETFX_CORE;WINDOWS_UWP
59 | true
60 | ;2008
61 | pdbonly
62 | x64
63 | false
64 | prompt
65 | true
66 | true
67 |
68 |
69 | true
70 | bin\x86\Debug\
71 | DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP
72 | ;2008
73 | full
74 | x86
75 | false
76 | prompt
77 | true
78 |
79 |
80 | bin\x86\Release\
81 | TRACE;NETFX_CORE;WINDOWS_UWP
82 | true
83 | ;2008
84 | pdbonly
85 | x86
86 | false
87 | prompt
88 | true
89 | true
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 | App.xaml
98 |
99 |
100 | MainPage.xaml
101 |
102 |
103 |
104 |
105 |
106 | Designer
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 | MSBuild:Compile
143 | Designer
144 |
145 |
146 | MSBuild:Compile
147 | Designer
148 |
149 |
150 |
151 |
152 | {e8eb6ee2-30fc-4bc3-ae8c-4160172a714c}
153 | TinyAccountManager.Abstraction
154 |
155 |
156 | {cb69e7da-fedc-4612-9f49-a02ebfec3894}
157 | TinyAccountManager.UWP
158 |
159 |
160 |
161 | 14.0
162 |
163 |
164 |
165 |
172 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.UWP/project.json:
--------------------------------------------------------------------------------
1 | {
2 | "dependencies": {
3 | "Microsoft.NETCore.UniversalWindowsPlatform": "5.2.2",
4 | "Xamarin.Forms": "2.4.0.280"
5 | },
6 | "frameworks": {
7 | "uap10.0": {}
8 | },
9 | "runtimes": {
10 | "win10-arm": {},
11 | "win10-arm-aot": {},
12 | "win10-x86": {},
13 | "win10-x86-aot": {},
14 | "win10-x64": {},
15 | "win10-x64-aot": {}
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 |
6 | using Xamarin.Forms;
7 |
8 | namespace TinyAccountManager.Sample
9 | {
10 | public class TinyAccountManager.Sample : ContentPage
11 | {
12 | public TinyAccountManager.Sample()
13 | {
14 | var button = new Button
15 | {
16 | Text = "Click Me!",
17 | VerticalOptions = LayoutOptions.CenterAndExpand,
18 | HorizontalOptions = LayoutOptions.CenterAndExpand,
19 | };
20 |
21 | int clicked = 0;
22 | button.Clicked += (s, e) => button.Text = "Clicked: " + clicked++;
23 |
24 | Content = button;
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 10.0
6 | Debug
7 | AnyCPU
8 | {C022A13D-8338-4AE2-B2B3-9E00CD9ADAA6}
9 | Library
10 | Properties
11 | TinyAccountManager.Sample
12 | TinyAccountManager.Sample
13 | v4.5
14 | Profile111
15 | 512
16 | {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
17 |
18 |
19 |
20 |
21 | true
22 | full
23 | false
24 | bin\Debug\
25 | DEBUG;TRACE
26 | prompt
27 | 4
28 |
29 |
30 | pdbonly
31 | true
32 | bin\Release\
33 | TRACE
34 | prompt
35 | 4
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 | ..\packages\Xamarin.Forms.2.4.0.280\lib\portable-win+net45+wp80+win81+wpa81\Xamarin.Forms.Core.dll
44 |
45 |
46 | ..\packages\Xamarin.Forms.2.4.0.280\lib\portable-win+net45+wp80+win81+wpa81\Xamarin.Forms.Platform.dll
47 |
48 |
49 | ..\packages\Xamarin.Forms.2.4.0.280\lib\portable-win+net45+wp80+win81+wpa81\Xamarin.Forms.Xaml.dll
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 | 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}.
60 |
61 |
62 |
63 |
70 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/AppDelegate.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 |
5 | using Foundation;
6 | using UIKit;
7 | using TinyAccountManager.iOS;
8 |
9 | namespace TinyAccountManager.Sample.iOS
10 | {
11 | // The UIApplicationDelegate for the application. This class is responsible for launching the
12 | // User Interface of the application, as well as listening (and optionally responding) to
13 | // application events from iOS.
14 | [Register("AppDelegate")]
15 | public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
16 | {
17 | //
18 | // This method is invoked when the application has loaded and is ready to run. In this
19 | // method you should instantiate the window, load the UI into it and then make the window
20 | // visible.
21 | //
22 | // You have 17 seconds to return from this method, or iOS will terminate your application.
23 | //
24 | public override bool FinishedLaunching(UIApplication app, NSDictionary options)
25 | {
26 | AccountManager.Initialize();
27 |
28 | global::Xamarin.Forms.Forms.Init ();
29 | LoadApplication (new TinyAccountManager.Sample.App ());
30 |
31 | return base.FinishedLaunching (app, options);
32 | }
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/Entitlements.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.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 | TinyAccountManager.Sample
27 | CFBundleIdentifier
28 | com.yourcompany.TinyAccountManager.Sample
29 | CFBundleVersion
30 | 1.0
31 | CFBundleIconFiles
32 |
33 | Icon-60@2x.png
34 | Icon-60@3x.png
35 | Icon-76.png
36 | Icon-76@2x.png
37 | Default.png
38 | Default@2x.png
39 | Default-568h@2x.png
40 | Default-Portrait.png
41 | Default-Portrait@2x.png
42 | Icon-Small-40.png
43 | Icon-Small-40@2x.png
44 | Icon-Small-40@3x.png
45 | Icon-Small.png
46 | Icon-Small@2x.png
47 | Icon-Small@3x.png
48 |
49 | UILaunchStoryboardName
50 | LaunchScreen.storyboard
51 |
52 |
53 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.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 TinyAccountManager.Sample.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 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.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("TinyAccountManager.Sample.iOS")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("TinyAccountManager.Sample.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 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/Resources/Default-568h@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/Resources/Default-568h@2x.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/Resources/Default-Portrait.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/Resources/Default-Portrait.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/Resources/Default-Portrait@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/Resources/Default-Portrait@2x.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/Resources/Default.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/Resources/Default.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/Resources/Default@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/Resources/Default@2x.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/Resources/Icon-60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/Resources/Icon-60@2x.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/Resources/Icon-60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/Resources/Icon-60@3x.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/Resources/Icon-76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/Resources/Icon-76.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/Resources/Icon-76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/Resources/Icon-76@2x.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/Resources/Icon-Small-40.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/Resources/Icon-Small-40.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/Resources/Icon-Small-40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/Resources/Icon-Small-40@2x.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/Resources/Icon-Small-40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/Resources/Icon-Small-40@3x.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/Resources/Icon-Small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/Resources/Icon-Small.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/Resources/Icon-Small@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/Resources/Icon-Small@2x.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/Resources/Icon-Small@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/Resources/Icon-Small@3x.png
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.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 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/TinyAccountManager.Sample.iOS.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | iPhoneSimulator
7 | 8.0.30703
8 | 2.0
9 | {8967E779-81D4-4597-981C-C4602967B278}
10 | {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
11 | Exe
12 | TinyAccountManager.Sample.iOS
13 | Resources
14 | TinyAccountManager.Sample.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 |
123 |
124 | ..\..\packages\Xamarin.Forms.2.4.0.280\lib\Xamarin.iOS10\Xamarin.Forms.Core.dll
125 |
126 |
127 | ..\..\packages\Xamarin.Forms.2.4.0.280\lib\Xamarin.iOS10\Xamarin.Forms.Platform.dll
128 |
129 |
130 | ..\..\packages\Xamarin.Forms.2.4.0.280\lib\Xamarin.iOS10\Xamarin.Forms.Platform.iOS.dll
131 |
132 |
133 | ..\..\packages\Xamarin.Forms.2.4.0.280\lib\Xamarin.iOS10\Xamarin.Forms.Xaml.dll
134 |
135 |
136 |
137 |
138 |
139 | {e8eb6ee2-30fc-4bc3-ae8c-4160172a714c}
140 | TinyAccountManager.Abstraction
141 |
142 |
143 | {4ac73eef-3fa5-4767-8a93-5db5c7aa9432}
144 | TinyAccountManager.iOS
145 | false
146 | false
147 |
148 |
149 |
150 |
151 |
152 |
153 | 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}.
154 |
155 |
156 |
157 |
158 |
159 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/iTunesArtwork:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/iTunesArtwork
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/iTunesArtwork@2x:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TinyStuff/TinyAccountManager/2f64996aefc731c627a8a98728b656d901f114d2/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/iTunesArtwork@2x
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample.iOS/packages.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample/App.xaml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample/App.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 |
6 | using Xamarin.Forms;
7 |
8 | namespace TinyAccountManager.Sample
9 | {
10 | public partial class App : Application
11 | {
12 | public App ()
13 | {
14 | InitializeComponent();
15 |
16 | MainPage = new NavigationPage(new TinyAccountManager.Sample.MainPage());
17 | }
18 |
19 | protected override void OnStart ()
20 | {
21 | // Handle when your app starts
22 | }
23 |
24 | protected override void OnSleep ()
25 | {
26 | // Handle when your app sleeps
27 | }
28 |
29 | protected override void OnResume ()
30 | {
31 | // Handle when your app resumes
32 | }
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample/MainPage.xaml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample/MainPage.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 | using Xamarin.Forms;
7 | using TinyAccountManager.Abstraction;
8 |
9 | namespace TinyAccountManager.Sample
10 | {
11 | public partial class MainPage : ContentPage
12 | {
13 | private IAccountManager accountManager;
14 |
15 | public MainPage()
16 | {
17 | InitializeComponent();
18 |
19 | accountManager = AccountManager.Current;
20 | }
21 |
22 | private async void SaveClicked(object sender, EventArgs e)
23 | {
24 | var data = new Dictionary();
25 | data.Add("Age", "29");
26 |
27 | var account = new Account()
28 | {
29 | ServiceId = "TinyAccountManager",
30 | Username = "TinyUser",
31 | Properties = data
32 | };
33 |
34 | await accountManager.Save(account);
35 | }
36 |
37 | private async void GetClicked(object sender, EventArgs e)
38 | {
39 | try
40 | {
41 | var account = await accountManager.Get("TinyAccountManager");
42 |
43 | await DisplayAlert("Message", account.Properties["Age"], "OK");
44 | }
45 | catch (Exception)
46 | {
47 |
48 | }
49 | }
50 |
51 | private async void ExistsClicked(object sender, EventArgs e)
52 | {
53 | try
54 | {
55 | var exists = await accountManager.Exists("TinyAccountManager");
56 |
57 | await DisplayAlert("Message", exists.ToString(), "OK");
58 | }
59 | catch (Exception)
60 | {
61 |
62 | }
63 | }
64 |
65 | private async void RemoveClicked(object sender, EventArgs e)
66 | {
67 | await accountManager.Remove("TinyAccountManager");
68 | }
69 |
70 | private async void ExistsFalseClicked(object sender, EventArgs e)
71 | {
72 | try
73 | {
74 | var exists = await accountManager.Exists(Guid.NewGuid().ToString());
75 |
76 | await DisplayAlert("Message", exists.ToString(), "OK");
77 | }
78 | catch (Exception ex)
79 | {
80 |
81 | }
82 | }
83 | }
84 | }
85 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample/TinyAccountManager.Sample.projitems:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | $(MSBuildAllProjects);$(MSBuildThisFileFullPath)
5 | true
6 | 90787e3d-ce86-4b58-9ce2-ba6d7f74477a
7 |
8 |
9 | TinyAccountManager.Sample
10 |
11 |
12 |
13 | App.xaml
14 |
15 |
16 | MainPage.xaml
17 |
18 |
19 |
20 |
21 | Designer
22 | MSBuild:UpdateDesignTimeXaml
23 |
24 |
25 | Designer
26 | MSBuild:UpdateDesignTimeXaml
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/TinyAccountManager.Sample/TinyAccountManager.Sample.shproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 90787e3d-ce86-4b58-9ce2-ba6d7f74477a
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.Sample/packages.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.UWP/AccountManager.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Threading.Tasks;
6 |
7 | namespace TinyAccountManager.UWP
8 | {
9 | public class AccountManager
10 | {
11 | public static void Initialize()
12 | {
13 | Abstraction.AccountManager.Current = new UWPAccountManager();
14 | }
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.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("TinyAccountManager.UWP")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("TinyAccountManager.UWP")]
13 | [assembly: AssemblyCopyright("Copyright © 2017")]
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)]
--------------------------------------------------------------------------------
/src/TinyAccountManager.UWP/Properties/TinyAccountManager.UWP.rd.xml:
--------------------------------------------------------------------------------
1 |
2 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.UWP/TinyAccountManager.UWP.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | AnyCPU
7 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}
8 | Library
9 | Properties
10 | TinyAccountManager.UWP
11 | TinyAccountManager.UWP
12 | en-US
13 | UAP
14 | 10.0.16299.0
15 | 10.0.14393.0
16 | 14
17 | 512
18 | {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
19 |
20 |
21 | AnyCPU
22 | true
23 | full
24 | false
25 | bin\Debug\
26 | DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP
27 | prompt
28 | 4
29 |
30 |
31 | AnyCPU
32 | pdbonly
33 | true
34 | bin\Release\
35 | TRACE;NETFX_CORE;WINDOWS_UWP
36 | prompt
37 | 4
38 |
39 |
40 | x86
41 | true
42 | bin\x86\Debug\
43 | DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP
44 | ;2008
45 | full
46 | x86
47 | false
48 | prompt
49 |
50 |
51 | x86
52 | bin\x86\Release\
53 | TRACE;NETFX_CORE;WINDOWS_UWP
54 | true
55 | ;2008
56 | pdbonly
57 | x86
58 | false
59 | prompt
60 |
61 |
62 | ARM
63 | true
64 | bin\ARM\Debug\
65 | DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP
66 | ;2008
67 | full
68 | ARM
69 | false
70 | prompt
71 |
72 |
73 | ARM
74 | bin\ARM\Release\
75 | TRACE;NETFX_CORE;WINDOWS_UWP
76 | true
77 | ;2008
78 | pdbonly
79 | ARM
80 | false
81 | prompt
82 |
83 |
84 | x64
85 | true
86 | bin\x64\Debug\
87 | DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP
88 | ;2008
89 | full
90 | x64
91 | false
92 | prompt
93 |
94 |
95 | x64
96 | bin\x64\Release\
97 | TRACE;NETFX_CORE;WINDOWS_UWP
98 | true
99 | ;2008
100 | pdbonly
101 | x64
102 | false
103 | prompt
104 |
105 |
106 | PackageReference
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 | 6.0.1
117 |
118 |
119 | 10.0.3
120 |
121 |
122 |
123 |
124 | {e8eb6ee2-30fc-4bc3-ae8c-4160172a714c}
125 | TinyAccountManager.Abstraction
126 |
127 |
128 |
129 | 14.0
130 |
131 |
132 |
139 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.UWP/UWPAccountManager.cs:
--------------------------------------------------------------------------------
1 | using Newtonsoft.Json;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 | using System.Text;
6 | using System.Threading.Tasks;
7 | using TinyAccountManager.Abstraction;
8 | using Windows.Security.Cryptography;
9 | using Windows.Security.Cryptography.DataProtection;
10 | using Windows.Storage;
11 | using System.IO;
12 |
13 | namespace TinyAccountManager.UWP
14 | {
15 | public class UWPAccountManager : IAccountManager
16 | {
17 | public async Task Exists(string serviceId)
18 | {
19 | var filename = serviceId;
20 |
21 | try
22 | {
23 | var file = await ApplicationData.Current.LocalFolder.GetFileAsync(filename);
24 |
25 | if (file == null)
26 | return false;
27 | }
28 | catch (Exception)
29 | {
30 | return false;
31 | }
32 |
33 | return true;
34 | }
35 |
36 | public async Task Get(string serviceId)
37 | {
38 | var filename = serviceId;
39 |
40 | var file = await ApplicationData.Current.LocalFolder.GetFileAsync(filename);
41 |
42 | var protectedBuffer = await FileIO.ReadBufferAsync(file);
43 |
44 | var provider = new DataProtectionProvider();
45 |
46 | var unprotectedBuffer = await provider.UnprotectAsync(protectedBuffer);
47 |
48 | var json = CryptographicBuffer.ConvertBinaryToString(BinaryStringEncoding.Utf8, unprotectedBuffer);
49 |
50 | var account = JsonConvert.DeserializeObject(json);
51 |
52 | return account;
53 | }
54 |
55 | public async Task Remove(string serviceId)
56 | {
57 | var filename = serviceId;
58 |
59 | var file = await ApplicationData.Current.LocalFolder.GetFileAsync(filename);
60 |
61 | await file.DeleteAsync(StorageDeleteOption.PermanentDelete);
62 | }
63 |
64 |
65 | public async Task Save(Account account)
66 | {
67 | if (string.IsNullOrWhiteSpace(account.ServiceId))
68 | {
69 | throw new Exception("serviceId must be set.");
70 | }
71 |
72 | var json = JsonConvert.SerializeObject(account);
73 |
74 | var localFolder = ApplicationData.Current.LocalFolder;
75 |
76 | var provider = new DataProtectionProvider("LOCAL=user");
77 |
78 | var buffer = CryptographicBuffer.ConvertStringToBinary(json, BinaryStringEncoding.Utf8);
79 |
80 | var protectedBuffer = await provider.ProtectAsync(buffer);
81 |
82 | var filename = account.ServiceId;
83 |
84 | var file = await ApplicationData.Current.LocalFolder.CreateFileAsync(filename,CreationCollisionOption.OpenIfExists);
85 |
86 | await FileIO.WriteBufferAsync(file, protectedBuffer);
87 | }
88 | }
89 | }
90 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.iOS/AccountManager.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Text;
4 |
5 | namespace TinyAccountManager.iOS
6 | {
7 | public class AccountManager
8 | {
9 | public static void Initialize()
10 | {
11 | Abstraction.AccountManager.Current = new iOSAccountManager();
12 | }
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.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("TinyAccountManager.iOS")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("TinyAccountManager.iOS")]
13 | [assembly: AssemblyCopyright("Copyright © 2017")]
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("4ac73eef-3fa5-4767-8a93-5db5c7aa9432")]
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 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.iOS/TinyAccountManager.iOS.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Debug
5 | AnyCPU
6 | 8.0.30703
7 | 2.0
8 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}
9 | {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
10 | Library
11 | TinyAccountManager.iOS
12 | Resources
13 | TinyAccountManager.iOS
14 |
15 |
16 | true
17 | full
18 | false
19 | bin\Debug
20 | DEBUG;
21 | prompt
22 | 4
23 | false
24 |
25 |
26 | full
27 | true
28 | bin\Release
29 | prompt
30 | 4
31 | false
32 |
33 |
34 |
35 |
36 | ..\packages\Newtonsoft.Json.10.0.3\lib\netstandard1.3\Newtonsoft.Json.dll
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 | {e8eb6ee2-30fc-4bc3-ae8c-4160172a714c}
59 | TinyAccountManager.Abstraction
60 |
61 |
62 |
63 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.iOS/iOSAccountManager.cs:
--------------------------------------------------------------------------------
1 | using Foundation;
2 | using Newtonsoft.Json;
3 | using Security;
4 | using System;
5 | using System.Collections.Generic;
6 | using System.Text;
7 | using System.Threading.Tasks;
8 | using TinyAccountManager.Abstraction;
9 |
10 | namespace TinyAccountManager.iOS
11 | {
12 | public class iOSAccountManager : IAccountManager
13 | {
14 | public async Task Save(Account account)
15 | {
16 | if(string.IsNullOrWhiteSpace(account.ServiceId))
17 | {
18 | throw new Exception("serviceId must be set.");
19 | }
20 |
21 | var data = JsonConvert.SerializeObject(account.Properties);
22 |
23 | var secRecord = new SecRecord(SecKind.GenericPassword)
24 | {
25 | Account = account.Username,
26 | Service = account.ServiceId,
27 | ValueData = NSData.FromString(data, NSStringEncoding.UTF8),
28 | Accessible = SecAccessible.AfterFirstUnlockThisDeviceOnly
29 | };
30 |
31 | var old = await Find(account.ServiceId);
32 |
33 | if (old == null)
34 | {
35 | var statusCode = SecKeyChain.Add(secRecord);
36 |
37 | return;
38 | }
39 |
40 | SecKeyChain.Update(old, secRecord);
41 |
42 | }
43 |
44 | private async Task Find(string serviceId)
45 | {
46 | var query = new SecRecord(SecKind.GenericPassword)
47 | {
48 | Service = serviceId
49 | };
50 |
51 | SecStatusCode status;
52 |
53 | var result = SecKeyChain.QueryAsRecord(query, out status);
54 |
55 | if(status == SecStatusCode.Success)
56 | {
57 | return result;
58 | }
59 |
60 | return null;
61 | }
62 |
63 | public async Task Exists(string serviceId)
64 | {
65 | var result = await Find(serviceId);
66 |
67 | return (result != null);
68 | }
69 |
70 | public async Task Get(string serviceId)
71 | {
72 | var result = await Find(serviceId);
73 |
74 | if(result == null)
75 | {
76 | throw new Exception(string.Format("Account with serviceId: {0}, does not exists", serviceId));
77 | }
78 |
79 | var account = new Account()
80 | {
81 | Username = result.Account,
82 | Properties = JsonConvert.DeserializeObject>(result.ValueData.ToString())
83 | };
84 |
85 | return account;
86 | }
87 |
88 | public async Task Remove(string serviceId)
89 | {
90 |
91 | var query = new SecRecord(SecKind.GenericPassword)
92 | {
93 | Service = serviceId
94 | };
95 |
96 | var status = SecKeyChain.Remove(query);
97 |
98 | if (status != SecStatusCode.Success)
99 | {
100 | throw new Exception("Account cannot be removed. Status code: " + status);
101 | }
102 | }
103 | }
104 | }
105 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.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 |
--------------------------------------------------------------------------------
/src/TinyAccountManager.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio 15
4 | VisualStudioVersion = 15.0.27004.2009
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TinyAccountManager.Abstraction", "TinyAccountManager.Abstraction\TinyAccountManager.Abstraction.csproj", "{E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}"
7 | EndProject
8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TinyAccountManager.iOS", "TinyAccountManager.iOS\TinyAccountManager.iOS.csproj", "{4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}"
9 | EndProject
10 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TinyAccountManager.Droid", "TinyAccountManager.Droid\TinyAccountManager.Droid.csproj", "{FAF32095-2542-4068-B4EE-20786357CDB4}"
11 | EndProject
12 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TinyAccountManager.UWP", "TinyAccountManager.UWP\TinyAccountManager.UWP.csproj", "{CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}"
13 | EndProject
14 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{DEF21157-4036-4A0B-9B5A-EE9C1CA6366A}"
15 | EndProject
16 | Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "TinyAccountManager.Sample", "TinyAccountManager.Sample\TinyAccountManager.Sample\TinyAccountManager.Sample.shproj", "{90787E3D-CE86-4B58-9CE2-BA6D7F74477A}"
17 | EndProject
18 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TinyAccountManager.Sample.Android", "TinyAccountManager.Sample\TinyAccountManager.Sample.Android\TinyAccountManager.Sample.Android.csproj", "{B55C2F88-6FD4-4376-A3EB-260C757CB789}"
19 | EndProject
20 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TinyAccountManager.Sample.iOS", "TinyAccountManager.Sample\TinyAccountManager.Sample.iOS\TinyAccountManager.Sample.iOS.csproj", "{8967E779-81D4-4597-981C-C4602967B278}"
21 | EndProject
22 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TinyAccountManager.Sample.UWP", "TinyAccountManager.Sample\TinyAccountManager.Sample.UWP\TinyAccountManager.Sample.UWP.csproj", "{725E90FA-C38A-4B9E-8E31-1A861CC29521}"
23 | EndProject
24 | Global
25 | GlobalSection(SharedMSBuildProjectFiles) = preSolution
26 | TinyAccountManager.Sample\TinyAccountManager.Sample\TinyAccountManager.Sample.projitems*{725e90fa-c38a-4b9e-8e31-1a861cc29521}*SharedItemsImports = 4
27 | TinyAccountManager.Sample\TinyAccountManager.Sample\TinyAccountManager.Sample.projitems*{8967e779-81d4-4597-981c-c4602967b278}*SharedItemsImports = 4
28 | TinyAccountManager.Sample\TinyAccountManager.Sample\TinyAccountManager.Sample.projitems*{90787e3d-ce86-4b58-9ce2-ba6d7f74477a}*SharedItemsImports = 13
29 | TinyAccountManager.Sample\TinyAccountManager.Sample\TinyAccountManager.Sample.projitems*{b55c2f88-6fd4-4376-a3eb-260c757cb789}*SharedItemsImports = 4
30 | EndGlobalSection
31 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
32 | Ad-Hoc|Any CPU = Ad-Hoc|Any CPU
33 | Ad-Hoc|ARM = Ad-Hoc|ARM
34 | Ad-Hoc|iPhone = Ad-Hoc|iPhone
35 | Ad-Hoc|iPhoneSimulator = Ad-Hoc|iPhoneSimulator
36 | Ad-Hoc|x64 = Ad-Hoc|x64
37 | Ad-Hoc|x86 = Ad-Hoc|x86
38 | AppStore|Any CPU = AppStore|Any CPU
39 | AppStore|ARM = AppStore|ARM
40 | AppStore|iPhone = AppStore|iPhone
41 | AppStore|iPhoneSimulator = AppStore|iPhoneSimulator
42 | AppStore|x64 = AppStore|x64
43 | AppStore|x86 = AppStore|x86
44 | Debug|Any CPU = Debug|Any CPU
45 | Debug|ARM = Debug|ARM
46 | Debug|iPhone = Debug|iPhone
47 | Debug|iPhoneSimulator = Debug|iPhoneSimulator
48 | Debug|x64 = Debug|x64
49 | Debug|x86 = Debug|x86
50 | Release|Any CPU = Release|Any CPU
51 | Release|ARM = Release|ARM
52 | Release|iPhone = Release|iPhone
53 | Release|iPhoneSimulator = Release|iPhoneSimulator
54 | Release|x64 = Release|x64
55 | Release|x86 = Release|x86
56 | EndGlobalSection
57 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
58 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
59 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
60 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU
61 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Ad-Hoc|ARM.Build.0 = Release|Any CPU
62 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
63 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
64 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
65 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
66 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU
67 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Ad-Hoc|x64.Build.0 = Release|Any CPU
68 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU
69 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Ad-Hoc|x86.Build.0 = Release|Any CPU
70 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
71 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.AppStore|Any CPU.Build.0 = Release|Any CPU
72 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.AppStore|ARM.ActiveCfg = Release|Any CPU
73 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.AppStore|ARM.Build.0 = Release|Any CPU
74 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.AppStore|iPhone.ActiveCfg = Release|Any CPU
75 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.AppStore|iPhone.Build.0 = Release|Any CPU
76 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
77 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
78 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.AppStore|x64.ActiveCfg = Release|Any CPU
79 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.AppStore|x64.Build.0 = Release|Any CPU
80 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.AppStore|x86.ActiveCfg = Release|Any CPU
81 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.AppStore|x86.Build.0 = Release|Any CPU
82 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
83 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Debug|Any CPU.Build.0 = Debug|Any CPU
84 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Debug|ARM.ActiveCfg = Debug|Any CPU
85 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Debug|ARM.Build.0 = Debug|Any CPU
86 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Debug|iPhone.ActiveCfg = Debug|Any CPU
87 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Debug|iPhone.Build.0 = Debug|Any CPU
88 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
89 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
90 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Debug|x64.ActiveCfg = Debug|Any CPU
91 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Debug|x64.Build.0 = Debug|Any CPU
92 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Debug|x86.ActiveCfg = Debug|Any CPU
93 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Debug|x86.Build.0 = Debug|Any CPU
94 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Release|Any CPU.ActiveCfg = Release|Any CPU
95 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Release|Any CPU.Build.0 = Release|Any CPU
96 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Release|ARM.ActiveCfg = Release|Any CPU
97 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Release|ARM.Build.0 = Release|Any CPU
98 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Release|iPhone.ActiveCfg = Release|Any CPU
99 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Release|iPhone.Build.0 = Release|Any CPU
100 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
101 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
102 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Release|x64.ActiveCfg = Release|Any CPU
103 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Release|x64.Build.0 = Release|Any CPU
104 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Release|x86.ActiveCfg = Release|Any CPU
105 | {E8EB6EE2-30FC-4BC3-AE8C-4160172A714C}.Release|x86.Build.0 = Release|Any CPU
106 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
107 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
108 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU
109 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Ad-Hoc|ARM.Build.0 = Release|Any CPU
110 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
111 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
112 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
113 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
114 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU
115 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Ad-Hoc|x64.Build.0 = Release|Any CPU
116 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU
117 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Ad-Hoc|x86.Build.0 = Release|Any CPU
118 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
119 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.AppStore|Any CPU.Build.0 = Release|Any CPU
120 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.AppStore|ARM.ActiveCfg = Release|Any CPU
121 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.AppStore|ARM.Build.0 = Release|Any CPU
122 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.AppStore|iPhone.ActiveCfg = Release|Any CPU
123 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.AppStore|iPhone.Build.0 = Release|Any CPU
124 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
125 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
126 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.AppStore|x64.ActiveCfg = Release|Any CPU
127 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.AppStore|x64.Build.0 = Release|Any CPU
128 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.AppStore|x86.ActiveCfg = Release|Any CPU
129 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.AppStore|x86.Build.0 = Release|Any CPU
130 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
131 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Debug|Any CPU.Build.0 = Debug|Any CPU
132 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Debug|ARM.ActiveCfg = Debug|Any CPU
133 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Debug|ARM.Build.0 = Debug|Any CPU
134 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Debug|iPhone.ActiveCfg = Debug|Any CPU
135 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Debug|iPhone.Build.0 = Debug|Any CPU
136 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
137 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
138 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Debug|x64.ActiveCfg = Debug|Any CPU
139 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Debug|x64.Build.0 = Debug|Any CPU
140 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Debug|x86.ActiveCfg = Debug|Any CPU
141 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Debug|x86.Build.0 = Debug|Any CPU
142 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Release|Any CPU.ActiveCfg = Release|Any CPU
143 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Release|Any CPU.Build.0 = Release|Any CPU
144 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Release|ARM.ActiveCfg = Release|Any CPU
145 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Release|ARM.Build.0 = Release|Any CPU
146 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Release|iPhone.ActiveCfg = Release|Any CPU
147 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Release|iPhone.Build.0 = Release|Any CPU
148 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
149 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
150 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Release|x64.ActiveCfg = Release|Any CPU
151 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Release|x64.Build.0 = Release|Any CPU
152 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Release|x86.ActiveCfg = Release|Any CPU
153 | {4AC73EEF-3FA5-4767-8A93-5DB5C7AA9432}.Release|x86.Build.0 = Release|Any CPU
154 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
155 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
156 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU
157 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Ad-Hoc|ARM.Build.0 = Release|Any CPU
158 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
159 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
160 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
161 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
162 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU
163 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Ad-Hoc|x64.Build.0 = Release|Any CPU
164 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU
165 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Ad-Hoc|x86.Build.0 = Release|Any CPU
166 | {FAF32095-2542-4068-B4EE-20786357CDB4}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
167 | {FAF32095-2542-4068-B4EE-20786357CDB4}.AppStore|Any CPU.Build.0 = Release|Any CPU
168 | {FAF32095-2542-4068-B4EE-20786357CDB4}.AppStore|ARM.ActiveCfg = Release|Any CPU
169 | {FAF32095-2542-4068-B4EE-20786357CDB4}.AppStore|ARM.Build.0 = Release|Any CPU
170 | {FAF32095-2542-4068-B4EE-20786357CDB4}.AppStore|iPhone.ActiveCfg = Release|Any CPU
171 | {FAF32095-2542-4068-B4EE-20786357CDB4}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
172 | {FAF32095-2542-4068-B4EE-20786357CDB4}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
173 | {FAF32095-2542-4068-B4EE-20786357CDB4}.AppStore|x64.ActiveCfg = Release|Any CPU
174 | {FAF32095-2542-4068-B4EE-20786357CDB4}.AppStore|x64.Build.0 = Release|Any CPU
175 | {FAF32095-2542-4068-B4EE-20786357CDB4}.AppStore|x86.ActiveCfg = Release|Any CPU
176 | {FAF32095-2542-4068-B4EE-20786357CDB4}.AppStore|x86.Build.0 = Release|Any CPU
177 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
178 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Debug|Any CPU.Build.0 = Debug|Any CPU
179 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Debug|ARM.ActiveCfg = Debug|Any CPU
180 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Debug|ARM.Build.0 = Debug|Any CPU
181 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Debug|iPhone.ActiveCfg = Debug|Any CPU
182 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Debug|iPhone.Build.0 = Debug|Any CPU
183 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
184 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
185 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Debug|x64.ActiveCfg = Debug|Any CPU
186 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Debug|x64.Build.0 = Debug|Any CPU
187 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Debug|x86.ActiveCfg = Debug|Any CPU
188 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Debug|x86.Build.0 = Debug|Any CPU
189 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Release|Any CPU.ActiveCfg = Release|Any CPU
190 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Release|Any CPU.Build.0 = Release|Any CPU
191 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Release|ARM.ActiveCfg = Release|Any CPU
192 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Release|ARM.Build.0 = Release|Any CPU
193 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Release|iPhone.ActiveCfg = Release|Any CPU
194 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Release|iPhone.Build.0 = Release|Any CPU
195 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
196 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
197 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Release|x64.ActiveCfg = Release|Any CPU
198 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Release|x64.Build.0 = Release|Any CPU
199 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Release|x86.ActiveCfg = Release|Any CPU
200 | {FAF32095-2542-4068-B4EE-20786357CDB4}.Release|x86.Build.0 = Release|Any CPU
201 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
202 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
203 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Ad-Hoc|ARM.ActiveCfg = Release|ARM
204 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Ad-Hoc|ARM.Build.0 = Release|ARM
205 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
206 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
207 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
208 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
209 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Ad-Hoc|x64.ActiveCfg = Release|x64
210 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Ad-Hoc|x64.Build.0 = Release|x64
211 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Ad-Hoc|x86.ActiveCfg = Release|x86
212 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Ad-Hoc|x86.Build.0 = Release|x86
213 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
214 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.AppStore|Any CPU.Build.0 = Release|Any CPU
215 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.AppStore|ARM.ActiveCfg = Release|ARM
216 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.AppStore|ARM.Build.0 = Release|ARM
217 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.AppStore|iPhone.ActiveCfg = Release|Any CPU
218 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
219 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
220 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.AppStore|x64.ActiveCfg = Release|x64
221 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.AppStore|x64.Build.0 = Release|x64
222 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.AppStore|x86.ActiveCfg = Release|x86
223 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.AppStore|x86.Build.0 = Release|x86
224 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
225 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Debug|Any CPU.Build.0 = Debug|Any CPU
226 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Debug|ARM.ActiveCfg = Debug|ARM
227 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Debug|ARM.Build.0 = Debug|ARM
228 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Debug|iPhone.ActiveCfg = Debug|Any CPU
229 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Debug|iPhone.Build.0 = Debug|Any CPU
230 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
231 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
232 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Debug|x64.ActiveCfg = Debug|x64
233 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Debug|x64.Build.0 = Debug|x64
234 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Debug|x86.ActiveCfg = Debug|x86
235 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Debug|x86.Build.0 = Debug|x86
236 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Release|Any CPU.ActiveCfg = Release|Any CPU
237 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Release|Any CPU.Build.0 = Release|Any CPU
238 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Release|ARM.ActiveCfg = Release|ARM
239 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Release|ARM.Build.0 = Release|ARM
240 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Release|iPhone.ActiveCfg = Release|Any CPU
241 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Release|iPhone.Build.0 = Release|Any CPU
242 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
243 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
244 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Release|x64.ActiveCfg = Release|x64
245 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Release|x64.Build.0 = Release|x64
246 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Release|x86.ActiveCfg = Release|x86
247 | {CB69E7DA-FEDC-4612-9F49-A02EBFEC3894}.Release|x86.Build.0 = Release|x86
248 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
249 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
250 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Ad-Hoc|Any CPU.Deploy.0 = Release|Any CPU
251 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU
252 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Ad-Hoc|ARM.Build.0 = Release|Any CPU
253 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Ad-Hoc|ARM.Deploy.0 = Release|Any CPU
254 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
255 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
256 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Ad-Hoc|iPhone.Deploy.0 = Release|Any CPU
257 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
258 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
259 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Release|Any CPU
260 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU
261 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Ad-Hoc|x64.Build.0 = Release|Any CPU
262 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Ad-Hoc|x64.Deploy.0 = Release|Any CPU
263 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU
264 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Ad-Hoc|x86.Build.0 = Release|Any CPU
265 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Ad-Hoc|x86.Deploy.0 = Release|Any CPU
266 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
267 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.AppStore|Any CPU.Build.0 = Release|Any CPU
268 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.AppStore|Any CPU.Deploy.0 = Release|Any CPU
269 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.AppStore|ARM.ActiveCfg = Release|Any CPU
270 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.AppStore|ARM.Build.0 = Release|Any CPU
271 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.AppStore|ARM.Deploy.0 = Release|Any CPU
272 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.AppStore|iPhone.ActiveCfg = Release|Any CPU
273 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
274 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
275 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.AppStore|iPhoneSimulator.Deploy.0 = Release|Any CPU
276 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.AppStore|x64.ActiveCfg = Release|Any CPU
277 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.AppStore|x64.Build.0 = Release|Any CPU
278 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.AppStore|x64.Deploy.0 = Release|Any CPU
279 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.AppStore|x86.ActiveCfg = Release|Any CPU
280 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.AppStore|x86.Build.0 = Release|Any CPU
281 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.AppStore|x86.Deploy.0 = Release|Any CPU
282 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
283 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Debug|Any CPU.Build.0 = Debug|Any CPU
284 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
285 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Debug|ARM.ActiveCfg = Debug|Any CPU
286 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Debug|ARM.Build.0 = Debug|Any CPU
287 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Debug|ARM.Deploy.0 = Debug|Any CPU
288 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Debug|iPhone.ActiveCfg = Debug|Any CPU
289 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Debug|iPhone.Build.0 = Debug|Any CPU
290 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Debug|iPhone.Deploy.0 = Debug|Any CPU
291 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
292 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
293 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU
294 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Debug|x64.ActiveCfg = Debug|Any CPU
295 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Debug|x64.Build.0 = Debug|Any CPU
296 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Debug|x64.Deploy.0 = Debug|Any CPU
297 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Debug|x86.ActiveCfg = Debug|Any CPU
298 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Debug|x86.Build.0 = Debug|Any CPU
299 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Debug|x86.Deploy.0 = Debug|Any CPU
300 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Release|Any CPU.ActiveCfg = Release|Any CPU
301 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Release|ARM.ActiveCfg = Release|Any CPU
302 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Release|ARM.Build.0 = Release|Any CPU
303 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Release|ARM.Deploy.0 = Release|Any CPU
304 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Release|iPhone.ActiveCfg = Release|Any CPU
305 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Release|iPhone.Build.0 = Release|Any CPU
306 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Release|iPhone.Deploy.0 = Release|Any CPU
307 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
308 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
309 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU
310 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Release|x64.ActiveCfg = Release|Any CPU
311 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Release|x64.Build.0 = Release|Any CPU
312 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Release|x64.Deploy.0 = Release|Any CPU
313 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Release|x86.ActiveCfg = Release|Any CPU
314 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Release|x86.Build.0 = Release|Any CPU
315 | {B55C2F88-6FD4-4376-A3EB-260C757CB789}.Release|x86.Deploy.0 = Release|Any CPU
316 | {8967E779-81D4-4597-981C-C4602967B278}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|iPhone
317 | {8967E779-81D4-4597-981C-C4602967B278}.Ad-Hoc|ARM.ActiveCfg = Ad-Hoc|iPhone
318 | {8967E779-81D4-4597-981C-C4602967B278}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone
319 | {8967E779-81D4-4597-981C-C4602967B278}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone
320 | {8967E779-81D4-4597-981C-C4602967B278}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator
321 | {8967E779-81D4-4597-981C-C4602967B278}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator
322 | {8967E779-81D4-4597-981C-C4602967B278}.Ad-Hoc|x64.ActiveCfg = Ad-Hoc|iPhone
323 | {8967E779-81D4-4597-981C-C4602967B278}.Ad-Hoc|x86.ActiveCfg = Ad-Hoc|iPhone
324 | {8967E779-81D4-4597-981C-C4602967B278}.AppStore|Any CPU.ActiveCfg = AppStore|iPhone
325 | {8967E779-81D4-4597-981C-C4602967B278}.AppStore|ARM.ActiveCfg = AppStore|iPhone
326 | {8967E779-81D4-4597-981C-C4602967B278}.AppStore|iPhone.ActiveCfg = AppStore|iPhone
327 | {8967E779-81D4-4597-981C-C4602967B278}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator
328 | {8967E779-81D4-4597-981C-C4602967B278}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator
329 | {8967E779-81D4-4597-981C-C4602967B278}.AppStore|x64.ActiveCfg = AppStore|iPhone
330 | {8967E779-81D4-4597-981C-C4602967B278}.AppStore|x86.ActiveCfg = AppStore|iPhone
331 | {8967E779-81D4-4597-981C-C4602967B278}.Debug|Any CPU.ActiveCfg = Debug|iPhone
332 | {8967E779-81D4-4597-981C-C4602967B278}.Debug|ARM.ActiveCfg = Debug|iPhone
333 | {8967E779-81D4-4597-981C-C4602967B278}.Debug|iPhone.ActiveCfg = Debug|iPhone
334 | {8967E779-81D4-4597-981C-C4602967B278}.Debug|iPhone.Build.0 = Debug|iPhone
335 | {8967E779-81D4-4597-981C-C4602967B278}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
336 | {8967E779-81D4-4597-981C-C4602967B278}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
337 | {8967E779-81D4-4597-981C-C4602967B278}.Debug|x64.ActiveCfg = Debug|iPhone
338 | {8967E779-81D4-4597-981C-C4602967B278}.Debug|x86.ActiveCfg = Debug|iPhone
339 | {8967E779-81D4-4597-981C-C4602967B278}.Release|Any CPU.ActiveCfg = Release|iPhone
340 | {8967E779-81D4-4597-981C-C4602967B278}.Release|ARM.ActiveCfg = Release|iPhone
341 | {8967E779-81D4-4597-981C-C4602967B278}.Release|iPhone.ActiveCfg = Release|iPhone
342 | {8967E779-81D4-4597-981C-C4602967B278}.Release|iPhone.Build.0 = Release|iPhone
343 | {8967E779-81D4-4597-981C-C4602967B278}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
344 | {8967E779-81D4-4597-981C-C4602967B278}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
345 | {8967E779-81D4-4597-981C-C4602967B278}.Release|x64.ActiveCfg = Release|iPhone
346 | {8967E779-81D4-4597-981C-C4602967B278}.Release|x86.ActiveCfg = Release|iPhone
347 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Ad-Hoc|Any CPU.ActiveCfg = Release|x86
348 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Ad-Hoc|Any CPU.Build.0 = Release|x86
349 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Ad-Hoc|Any CPU.Deploy.0 = Release|x86
350 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Ad-Hoc|ARM.ActiveCfg = Release|ARM
351 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Ad-Hoc|ARM.Build.0 = Release|ARM
352 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Ad-Hoc|ARM.Deploy.0 = Release|ARM
353 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Ad-Hoc|iPhone.ActiveCfg = Release|x86
354 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Ad-Hoc|iPhone.Build.0 = Release|x86
355 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Ad-Hoc|iPhone.Deploy.0 = Release|x86
356 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|x86
357 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|x86
358 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Ad-Hoc|iPhoneSimulator.Deploy.0 = Release|x86
359 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Ad-Hoc|x64.ActiveCfg = Release|x64
360 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Ad-Hoc|x64.Build.0 = Release|x64
361 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Ad-Hoc|x64.Deploy.0 = Release|x64
362 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Ad-Hoc|x86.ActiveCfg = Release|x86
363 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Ad-Hoc|x86.Build.0 = Release|x86
364 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Ad-Hoc|x86.Deploy.0 = Release|x86
365 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.AppStore|Any CPU.ActiveCfg = Release|x86
366 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.AppStore|Any CPU.Build.0 = Release|x86
367 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.AppStore|Any CPU.Deploy.0 = Release|x86
368 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.AppStore|ARM.ActiveCfg = Release|ARM
369 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.AppStore|ARM.Build.0 = Release|ARM
370 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.AppStore|ARM.Deploy.0 = Release|ARM
371 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.AppStore|iPhone.ActiveCfg = Release|x86
372 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.AppStore|iPhoneSimulator.ActiveCfg = Release|x86
373 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.AppStore|iPhoneSimulator.Build.0 = Release|x86
374 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.AppStore|iPhoneSimulator.Deploy.0 = Release|x86
375 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.AppStore|x64.ActiveCfg = Release|x64
376 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.AppStore|x64.Build.0 = Release|x64
377 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.AppStore|x64.Deploy.0 = Release|x64
378 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.AppStore|x86.ActiveCfg = Release|x86
379 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.AppStore|x86.Build.0 = Release|x86
380 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.AppStore|x86.Deploy.0 = Release|x86
381 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Debug|Any CPU.ActiveCfg = Debug|x86
382 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Debug|ARM.ActiveCfg = Debug|ARM
383 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Debug|ARM.Build.0 = Debug|ARM
384 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Debug|ARM.Deploy.0 = Debug|ARM
385 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Debug|iPhone.ActiveCfg = Debug|x86
386 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Debug|iPhoneSimulator.ActiveCfg = Debug|x86
387 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Debug|x64.ActiveCfg = Debug|x64
388 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Debug|x64.Build.0 = Debug|x64
389 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Debug|x64.Deploy.0 = Debug|x64
390 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Debug|x86.ActiveCfg = Debug|x86
391 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Debug|x86.Build.0 = Debug|x86
392 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Debug|x86.Deploy.0 = Debug|x86
393 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Release|Any CPU.ActiveCfg = Release|x86
394 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Release|ARM.ActiveCfg = Release|ARM
395 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Release|ARM.Build.0 = Release|ARM
396 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Release|ARM.Deploy.0 = Release|ARM
397 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Release|iPhone.ActiveCfg = Release|x86
398 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Release|iPhoneSimulator.ActiveCfg = Release|x86
399 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Release|x64.ActiveCfg = Release|x64
400 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Release|x64.Build.0 = Release|x64
401 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Release|x64.Deploy.0 = Release|x64
402 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Release|x86.ActiveCfg = Release|x86
403 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Release|x86.Build.0 = Release|x86
404 | {725E90FA-C38A-4B9E-8E31-1A861CC29521}.Release|x86.Deploy.0 = Release|x86
405 | EndGlobalSection
406 | GlobalSection(SolutionProperties) = preSolution
407 | HideSolutionNode = FALSE
408 | EndGlobalSection
409 | GlobalSection(NestedProjects) = preSolution
410 | {90787E3D-CE86-4B58-9CE2-BA6D7F74477A} = {DEF21157-4036-4A0B-9B5A-EE9C1CA6366A}
411 | {B55C2F88-6FD4-4376-A3EB-260C757CB789} = {DEF21157-4036-4A0B-9B5A-EE9C1CA6366A}
412 | {8967E779-81D4-4597-981C-C4602967B278} = {DEF21157-4036-4A0B-9B5A-EE9C1CA6366A}
413 | {725E90FA-C38A-4B9E-8E31-1A861CC29521} = {DEF21157-4036-4A0B-9B5A-EE9C1CA6366A}
414 | EndGlobalSection
415 | GlobalSection(ExtensibilityGlobals) = postSolution
416 | SolutionGuid = {73183445-05CD-4056-95FF-20CF33610636}
417 | EndGlobalSection
418 | EndGlobal
419 |
--------------------------------------------------------------------------------