Browse files

Added Reviews, moved all to NSOperations, lots of things

git-svn-id: https://svn.cocoanetics.com/myappsales/trunk@76 3a964c32-7461-4f60-ae82-ad05498e24dc
  • Loading branch information...
1 parent 2071009 commit c665fe790c667b15f55b136f2e9cd815583df80e oliver committed Sep 15, 2009
Showing with 10,919 additions and 2,339 deletions.
  1. +221 −241 ASiST.xcodeproj/Oliver.mode1v3
  2. +6,083 −1,817 ASiST.xcodeproj/Oliver.pbxuser
  3. +218 −22 ASiST.xcodeproj/project.pbxproj
  4. +11 −1 App.h
  5. +119 −4 App.m
  6. +5 −2 Classes/ASiSTAppDelegate.h
  7. +86 −11 Classes/ASiSTAppDelegate.m
  8. +0 −2 Classes/Account.m
  9. +1 −1 Classes/AccountManager.m
  10. +22 −0 Classes/AppDetailViewController.h
  11. +272 −0 Classes/AppDetailViewController.m
  12. +13 −4 Classes/AppViewController.m
  13. +5 −0 Classes/Country.h
  14. +9 −2 Classes/Country.m
  15. +71 −0 Classes/ISO8601DateFormatter.h
  16. +837 −0 Classes/ISO8601DateFormatter.m
  17. +0 −22 Classes/ImageManipulator.h
  18. +0 −5 Classes/ImageResizing.h
  19. +0 −16 Classes/ImageResizing.m
  20. +36 −0 Classes/ItunesConnectDownloaderOperation.h
  21. +549 −0 Classes/ItunesConnectDownloaderOperation.m
  22. +19 −0 Classes/NSDate+Helpers.h
  23. +49 −0 Classes/NSDate+Helpers.m
  24. +16 −0 Classes/NSDictionary+Helpers.h
  25. +33 −0 Classes/NSDictionary+Helpers.m
  26. +1 −0 Classes/NSString+Helpers.h
  27. +34 −0 Classes/NSString+Helpers.m
  28. +2 −0 Classes/Report.h
  29. +26 −8 Classes/Report.m
  30. +2 −0 Classes/ReportAppsController.h
  31. +54 −6 Classes/ReportAppsController.m
  32. +14 −2 Classes/ReportRootController.m
  33. +0 −1 Classes/ReportViewController.h
  34. +54 −41 Classes/ReportViewController.m
  35. +27 −0 Classes/ReviewCell.h
  36. +142 −0 Classes/ReviewCell.m
  37. +44 −0 Classes/ReviewDownloaderOperation.h
  38. +276 −0 Classes/ReviewDownloaderOperation.m
  39. +4 −1 Classes/SettingsViewController.h
  40. +181 −68 Classes/SettingsViewController.m
  41. +2 −0 Classes/StatusInfoController.h
  42. +43 −4 Classes/StatusInfoController.m
  43. +31 −0 Classes/SynchingManager.h
  44. +142 −0 Classes/SynchingManager.m
  45. +33 −0 Classes/TableListSelectorView.h
  46. +197 −0 Classes/TableListSelectorView.m
  47. +11 −1 Classes/TableListView.m
  48. +22 −0 Classes/UIImage+Helpers.h
  49. +45 −3 Classes/{ImageManipulator.m → UIImage+Helpers.m}
  50. +2 −2 Classes/iTunesConnect.m
  51. +7 −0 Database.h
  52. +166 −17 Database.m
  53. +1 −1 Info.plist
  54. +340 −34 MainWindow.xib
  55. +18 −0 NSArray+Reports.h
  56. +29 −0 NSArray+Reports.m
  57. +47 −0 Review.h
  58. +110 −0 Review.m
  59. BIN Star Images/0star_16.png
  60. BIN Star Images/1star.png
  61. BIN Star Images/1star_16.png
  62. BIN Star Images/2stars.png
  63. BIN Star Images/2stars_16.png
  64. BIN Star Images/3stars.png
  65. BIN Star Images/3stars_16.png
  66. BIN Star Images/4stars.png
  67. BIN Star Images/4stars_16.png
  68. BIN Star Images/5stars.png
  69. BIN Star Images/5stars_16.png
  70. BIN cover_mask_rounded_100x100.png
  71. BIN down.png
  72. BIN images/countries/DOM.png
  73. BIN images/countries/ECU.png
  74. BIN images/countries/EGY.png
  75. BIN images/countries/EST.png
  76. BIN images/countries/HND.png
  77. BIN images/countries/JAM.png
  78. BIN images/countries/KAZ.png
  79. BIN images/countries/LTU.png
  80. BIN images/countries/LVA.png
  81. BIN images/countries/MAC.png
  82. BIN images/countries/MDA.png
  83. BIN images/countries/URY.png
  84. BIN up.png
  85. +19 −0 update_1_to_2.sql
  86. +118 −0 update_2_to_3.sql
View
462 ASiST.xcodeproj/Oliver.mode1v3
@@ -202,24 +202,24 @@
<key>Content</key>
<dict>
<key>PBXProjectModuleGUID</key>
- <string>A7B433F7105806C9007BC954</string>
+ <string>A7BD674C105ADA610021B6CF</string>
<key>PBXProjectModuleLabel</key>
- <string>ZipArchive.mm</string>
+ <string>App.m</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict>
<key>Split0</key>
<dict>
<key>PBXProjectModuleGUID</key>
- <string>A7B433F8105806C9007BC954</string>
+ <string>A7BD674D105ADA610021B6CF</string>
<key>PBXProjectModuleLabel</key>
- <string>ZipArchive.mm</string>
+ <string>App.m</string>
<key>_historyCapacity</key>
<integer>0</integer>
<key>bookmark</key>
- <string>A7F49D7E105921AA00817D3D</string>
+ <string>A78DED4A105FDF6200786950</string>
<key>history</key>
<array>
- <string>A7B4382A105904E2007BC954</string>
+ <string>A709DDCB105F844900FD8909</string>
</array>
</dict>
<key>SplitCount</key>
@@ -231,131 +231,11 @@
<key>Geometry</key>
<dict>
<key>Frame</key>
- <string>{{0, 20}, {1027, 131}}</string>
+ <string>{{0, 20}, {819, 597}}</string>
<key>PBXModuleWindowStatusBarHidden2</key>
<false/>
<key>RubberWindowFrame</key>
- <string>413 513 1027 172 0 0 1440 878 </string>
- </dict>
- </dict>
- <dict>
- <key>Content</key>
- <dict>
- <key>PBXProjectModuleGUID</key>
- <string>A7B432281057E293007BC954</string>
- <key>PBXProjectModuleLabel</key>
- <string>ASiSTAppDelegate.m</string>
- <key>PBXSplitModuleInNavigatorKey</key>
- <dict>
- <key>Split0</key>
- <dict>
- <key>PBXProjectModuleGUID</key>
- <string>A7B432291057E293007BC954</string>
- <key>PBXProjectModuleLabel</key>
- <string>ASiSTAppDelegate.m</string>
- <key>_historyCapacity</key>
- <integer>0</integer>
- <key>bookmark</key>
- <string>A7F49D7F105921AA00817D3D</string>
- <key>history</key>
- <array>
- <string>A7B4382B105904E2007BC954</string>
- </array>
- </dict>
- <key>SplitCount</key>
- <string>1</string>
- </dict>
- <key>StatusBarVisibility</key>
- <true/>
- </dict>
- <key>Geometry</key>
- <dict>
- <key>Frame</key>
- <string>{{0, 20}, {1233, 131}}</string>
- <key>PBXModuleWindowStatusBarHidden2</key>
- <false/>
- <key>RubberWindowFrame</key>
- <string>207 513 1233 172 0 0 1440 878 </string>
- </dict>
- </dict>
- <dict>
- <key>Content</key>
- <dict>
- <key>PBXProjectModuleGUID</key>
- <string>A7B42CC31056914A007BC954</string>
- <key>PBXProjectModuleLabel</key>
- <string>SecItem.h</string>
- <key>PBXSplitModuleInNavigatorKey</key>
- <dict>
- <key>Split0</key>
- <dict>
- <key>PBXProjectModuleGUID</key>
- <string>A7B42CC41056914A007BC954</string>
- <key>PBXProjectModuleLabel</key>
- <string>SecItem.h</string>
- <key>_historyCapacity</key>
- <integer>0</integer>
- <key>bookmark</key>
- <string>A7F49D80105921AA00817D3D</string>
- <key>history</key>
- <array>
- <string>A7B4382C105904E2007BC954</string>
- </array>
- </dict>
- <key>SplitCount</key>
- <string>1</string>
- </dict>
- <key>StatusBarVisibility</key>
- <true/>
- </dict>
- <key>Geometry</key>
- <dict>
- <key>Frame</key>
- <string>{{0, 20}, {1301, 131}}</string>
- <key>PBXModuleWindowStatusBarHidden2</key>
- <false/>
- <key>RubberWindowFrame</key>
- <string>139 513 1301 172 0 0 1440 878 </string>
- </dict>
- </dict>
- <dict>
- <key>Content</key>
- <dict>
- <key>PBXProjectModuleGUID</key>
- <string>A7B42C8910568D0B007BC954</string>
- <key>PBXProjectModuleLabel</key>
- <string>EditAccountController.m</string>
- <key>PBXSplitModuleInNavigatorKey</key>
- <dict>
- <key>Split0</key>
- <dict>
- <key>PBXProjectModuleGUID</key>
- <string>A7B42C8A10568D0B007BC954</string>
- <key>PBXProjectModuleLabel</key>
- <string>EditAccountController.m</string>
- <key>_historyCapacity</key>
- <integer>0</integer>
- <key>bookmark</key>
- <string>A7F49D81105921AA00817D3D</string>
- <key>history</key>
- <array>
- <string>A7B4382E105904E2007BC954</string>
- </array>
- </dict>
- <key>SplitCount</key>
- <string>1</string>
- </dict>
- <key>StatusBarVisibility</key>
- <true/>
- </dict>
- <key>Geometry</key>
- <dict>
- <key>Frame</key>
- <string>{{0, 20}, {1301, 131}}</string>
- <key>PBXModuleWindowStatusBarHidden2</key>
- <false/>
- <key>RubberWindowFrame</key>
- <string>139 513 1301 172 0 0 1440 878 </string>
+ <string>397 218 819 638 0 0 1440 878 </string>
</dict>
</dict>
</array>
@@ -428,14 +308,17 @@
<array>
<string>29B97314FDCFA39411CA2CEA</string>
<string>A7B3B4030F169C9100D211A0</string>
+ <string>A7B3B4040F169CA000D211A0</string>
<string>080E96DDFE201D6D7F000001</string>
+ <string>A7A84EEA105E762B00CAD54F</string>
<string>A7B4331F1057F11A007BC954</string>
+ <string>A7BD65DC105AB6A60021B6CF</string>
+ <string>A7B42AF910564D53007BC954</string>
<string>A73CEBC510444425008778BF</string>
<string>A707A33F0FA61305004060D9</string>
- <string>A7B434DF1058C98E007BC954</string>
<string>A7248AC60F1BEEEA003DADDD</string>
- <string>A7006B400F3B09EB009BB6A5</string>
- <string>A7006B410F3B0A0C009BB6A5</string>
+ <string>A74A71D40EFB0651003B5191</string>
+ <string>A79272500F2D95F9009AF9B2</string>
<string>29B97315FDCFA39411CA2CEA</string>
<string>A7EB524F104825E3005452BE</string>
<string>29B97317FDCFA39411CA2CEA</string>
@@ -448,15 +331,80 @@
<key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>
<array>
<array>
- <integer>51</integer>
- <integer>28</integer>
+ <integer>24</integer>
+ <integer>23</integer>
+ <integer>1</integer>
+ <integer>0</integer>
+ </array>
+ <array>
+ <integer>25</integer>
+ <integer>23</integer>
+ <integer>1</integer>
+ <integer>0</integer>
+ </array>
+ <array>
+ <integer>26</integer>
+ <integer>23</integer>
+ <integer>1</integer>
+ <integer>0</integer>
+ </array>
+ <array>
<integer>27</integer>
- <integer>22</integer>
+ <integer>23</integer>
+ <integer>1</integer>
+ <integer>0</integer>
+ </array>
+ <array>
+ <integer>28</integer>
+ <integer>23</integer>
+ <integer>1</integer>
+ <integer>0</integer>
+ </array>
+ <array>
+ <integer>29</integer>
+ <integer>23</integer>
+ <integer>1</integer>
+ <integer>0</integer>
+ </array>
+ <array>
+ <integer>30</integer>
+ <integer>23</integer>
+ <integer>1</integer>
+ <integer>0</integer>
+ </array>
+ <array>
+ <integer>31</integer>
+ <integer>23</integer>
+ <integer>1</integer>
+ <integer>0</integer>
+ </array>
+ <array>
+ <integer>32</integer>
+ <integer>23</integer>
+ <integer>1</integer>
+ <integer>0</integer>
+ </array>
+ <array>
+ <integer>33</integer>
+ <integer>23</integer>
+ <integer>1</integer>
+ <integer>0</integer>
+ </array>
+ <array>
+ <integer>34</integer>
+ <integer>23</integer>
+ <integer>1</integer>
+ <integer>0</integer>
+ </array>
+ <array>
+ <integer>35</integer>
+ <integer>23</integer>
+ <integer>1</integer>
<integer>0</integer>
</array>
</array>
<key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key>
- <string>{{0, 697}, {375, 620}}</string>
+ <string>{{0, 3681}, {375, 620}}</string>
</dict>
<key>PBXTopSmartGroupGIDs</key>
<array/>
@@ -477,7 +425,7 @@
<real>353</real>
</array>
<key>RubberWindowFrame</key>
- <string>565 199 1360 679 0 0 1440 878 </string>
+ <string>63 96 1360 679 0 0 1440 878 </string>
</dict>
<key>Module</key>
<string>PBXSmartGroupTreeModule</string>
@@ -539,8 +487,6 @@
<string>A707A2FC0FA5FC0A004060D9</string>
<string>A707A2FE0FA5FC0A004060D9</string>
<string>A707A3400FA613B8004060D9</string>
- <string>A707A3420FA613B8004060D9</string>
- <string>A707A3440FA613B8004060D9</string>
<string>A707A3450FA613B8004060D9</string>
<string>A7611FB60FAE1DCB00BFE856</string>
<string>A7ACC3450FE62BE10014DB41</string>
@@ -549,7 +495,6 @@
<string>A72F83590FF1F7E300870B9A</string>
<string>A70B01D50FF75AD300E872F5</string>
<string>A7A2496F10038EA500D6D106</string>
- <string>A7F2728B100B940300C5E8FF</string>
<string>A731C0D31017A53E00EFFF9F</string>
<string>A731C0D41017A53E00EFFF9F</string>
<string>A73479A910396B5500F8F8C1</string>
@@ -573,7 +518,6 @@
<string>A7EB4A641046B77F005452BE</string>
<string>A7EB4AFD1046BF3E005452BE</string>
<string>A7EB4B181046C82A005452BE</string>
- <string>A7EB4C281046F3BB005452BE</string>
<string>A7EB4D7E1047038C005452BE</string>
<string>A7EB4E401047AB9B005452BE</string>
<string>A7EB4E631047AD98005452BE</string>
@@ -615,10 +559,8 @@
<string>A7E9E6331049E4B30042FD91</string>
<string>A7E9E66B1049E59E0042FD91</string>
<string>A7E9E7351049EBB40042FD91</string>
- <string>A7E9E77C1049ECA00042FD91</string>
<string>A7E9E7C71049EDB50042FD91</string>
<string>A7E9E7C81049EDB50042FD91</string>
- <string>A7279CA8104A755A00D7E9CE</string>
<string>A7279CA9104A755A00D7E9CE</string>
<string>A71B829C104C004600654CBD</string>
<string>A71B829D104C004600654CBD</string>
@@ -636,7 +578,7 @@
<key>Frame</key>
<string>{{0, 0}, {963, 0}}</string>
<key>RubberWindowFrame</key>
- <string>565 199 1360 679 0 0 1440 878 </string>
+ <string>63 96 1360 679 0 0 1440 878 </string>
</dict>
<key>Module</key>
<string>PBXNavigatorGroup</string>
@@ -651,26 +593,25 @@
<key>PBXProjectModuleGUID</key>
<string>1CE0B20306471E060097A5F4</string>
<key>PBXProjectModuleLabel</key>
- <string>SettingsViewController.m</string>
+ <string>Database.m</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict>
<key>Split0</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>1CE0B20406471E060097A5F4</string>
<key>PBXProjectModuleLabel</key>
- <string>SettingsViewController.m</string>
+ <string>Database.m</string>
<key>_historyCapacity</key>
<integer>0</integer>
<key>bookmark</key>
- <string>A7F49D7D105921AA00817D3D</string>
+ <string>A78DED49105FDF6200786950</string>
<key>history</key>
<array>
<string>A72486290F1B24FF003DADDD</string>
<string>A7325DBB0F237F770053AEB1</string>
<string>A7AB0C300F31223C00085D99</string>
<string>A7AB0C310F31223C00085D99</string>
- <string>A7357CC10F335B4300502F15</string>
<string>A70619560F358FDE00F605C1</string>
<string>A76D09900F39BC3E0081C7EF</string>
<string>A76D09A70F39BE540081C7EF</string>
@@ -696,7 +637,6 @@
<string>A736BF5E0F4108E400126FD3</string>
<string>A736BF5F0F4108E400126FD3</string>
<string>A7BA18F70F55C4E400C89F9C</string>
- <string>A7BA18FD0F55C4E400C89F9C</string>
<string>A779A7A80F59A9CB00800C16</string>
<string>A7EDD3900FA4E9100079FE78</string>
<string>A7EDD4310FA4F1B20079FE78</string>
@@ -708,69 +648,39 @@
<string>A707A3400FA613B8004060D9</string>
<string>A707A3450FA613B8004060D9</string>
<string>A7611FB60FAE1DCB00BFE856</string>
- <string>A7F6FDDD0FC13D6600AD83AF</string>
<string>A72F83550FF1F7E300870B9A</string>
<string>A7A2496F10038EA500D6D106</string>
- <string>A7A24CF51005011000D6D106</string>
- <string>A79AAAFB1006B35800915637</string>
- <string>A79AAE871008AADF00915637</string>
<string>A759A966100F0A480036EE43</string>
<string>A731C0D31017A53E00EFFF9F</string>
<string>A731C0D41017A53E00EFFF9F</string>
<string>A7347A031039E96700F8F8C1</string>
<string>A7347A0F1039EE4300F8F8C1</string>
<string>A73CE86210428169008778BF</string>
- <string>A73CE86310428169008778BF</string>
- <string>A73CE86710428169008778BF</string>
<string>A73CE9411042B258008778BF</string>
<string>A73CEA0C1042E702008778BF</string>
<string>A73CEBD7104446DF008778BF</string>
- <string>A73CEBDD104446DF008778BF</string>
<string>A7C7E8A81045903C00D413D0</string>
<string>A7C7E93610459F8600D413D0</string>
<string>A7C7EA3A104664D900D413D0</string>
<string>A7C7EA3B104664D900D413D0</string>
- <string>A7EB490010469556005452BE</string>
<string>A7EB4A641046B77F005452BE</string>
<string>A7EB4B0D1046C6B2005452BE</string>
<string>A7EB4B181046C82A005452BE</string>
- <string>A7EB4D191046FFFC005452BE</string>
- <string>A7EB4D1B1046FFFC005452BE</string>
<string>A7EB4D7E1047038C005452BE</string>
- <string>A7EB4DFD1047A767005452BE</string>
- <string>A7EB4E411047AB9B005452BE</string>
<string>A72B1782104C1FFB00D72FDE</string>
<string>A72B17A6104C212400D72FDE</string>
<string>A72B17A7104C212400D72FDE</string>
- <string>A7F08FCA104C4031007F3871</string>
- <string>A7ABCFC9104C511B0021E002</string>
- <string>A7ABCFE6104C58B70021E002</string>
- <string>A7B12B18104CA240004639C9</string>
- <string>A7B12BC3104CAABE004639C9</string>
<string>A7B12C41104CB0D4004639C9</string>
- <string>A7B12C43104CB0D4004639C9</string>
- <string>A7B12CE4104D2BAF004639C9</string>
<string>A776819F104D5AC7003295D7</string>
<string>A77681A0104D5AC7003295D7</string>
<string>A77681A1104D5AC7003295D7</string>
- <string>A77681CF104D5D88003295D7</string>
- <string>A77681F2104DC16C003295D7</string>
- <string>A77681F5104DC16C003295D7</string>
- <string>A7768205104DC258003295D7</string>
- <string>A776820B104DC3B8003295D7</string>
- <string>A77682E5104E548A003295D7</string>
- <string>A77682E6104E548A003295D7</string>
<string>A7047BA7104EDF44002F1333</string>
- <string>A7047BA8104EDF44002F1333</string>
<string>A7047BFD104EE164002F1333</string>
<string>A731EA13104F979B005F9495</string>
<string>A7F52DE91051944F008E31E5</string>
<string>A7F533331052E512008E31E5</string>
- <string>A7F533351052E512008E31E5</string>
- <string>A7B424E510553C87007BC954</string>
<string>A7B4252B105547AE007BC954</string>
<string>A7B4276A10559F57007BC954</string>
- <string>A7B4292F1055CB8C007BC954</string>
<string>A7B42A4710563B94007BC954</string>
<string>A7B42C2D10568368007BC954</string>
<string>A7B42C37105684FE007BC954</string>
@@ -779,47 +689,117 @@
<string>A7B42CBC1056914A007BC954</string>
<string>A7B42DB710569C2A007BC954</string>
<string>A7B42E521056A28F007BC954</string>
- <string>A7B42E801056A51D007BC954</string>
- <string>A7B42E8A1056A6BE007BC954</string>
- <string>A7B4314A1057C735007BC954</string>
- <string>A7B4318D1057CC85007BC954</string>
<string>A7B4318E1057CC85007BC954</string>
<string>A7B431BF1057CF02007BC954</string>
<string>A7B431C01057CF02007BC954</string>
<string>A7B431C11057CF02007BC954</string>
<string>A7B4321D1057E293007BC954</string>
<string>A7B4321E1057E293007BC954</string>
- <string>A7B4321F1057E293007BC954</string>
<string>A7B432201057E293007BC954</string>
<string>A7B432221057E293007BC954</string>
<string>A7B432DC1057ECF3007BC954</string>
- <string>A7B433461057F342007BC954</string>
- <string>A7B433471057F342007BC954</string>
<string>A7B433741057F51C007BC954</string>
<string>A7B433961057F6F0007BC954</string>
<string>A7B433971057F6F0007BC954</string>
<string>A7B433E0105805C6007BC954</string>
<string>A7B433F4105806C9007BC954</string>
<string>A7B4340B105808CD007BC954</string>
- <string>A7B4344B10580DC4007BC954</string>
<string>A7B435051058D5E5007BC954</string>
<string>A7B435061058D5E5007BC954</string>
- <string>A7B435081058D5E5007BC954</string>
- <string>A7B435091058D5E5007BC954</string>
<string>A7B4355B1058D8E9007BC954</string>
<string>A7B435991058DB01007BC954</string>
<string>A7B435BF1058DCC5007BC954</string>
<string>A7B435E01058DEED007BC954</string>
- <string>A7B436311058E90A007BC954</string>
<string>A7B4367F1058EE04007BC954</string>
<string>A7B4379D1058FE27007BC954</string>
- <string>A7B437B81058FF8C007BC954</string>
<string>A7B437BA1058FF8C007BC954</string>
- <string>A7F49CFA1059083700817D3D</string>
- <string>A7F49CFB1059083700817D3D</string>
- <string>A7F49CFD1059083700817D3D</string>
- <string>A7F49D72105920CA00817D3D</string>
- <string>A7F49D73105920CA00817D3D</string>
+ <string>A7F49F23105A687C00817D3D</string>
+ <string>A7CD06AE105A7366005F9166</string>
+ <string>A7CD06DB105A771B005F9166</string>
+ <string>A7CD070F105A7B81005F9166</string>
+ <string>A7CD0710105A7B81005F9166</string>
+ <string>A7BD66C2105ACF990021B6CF</string>
+ <string>A7BD670C105AD4550021B6CF</string>
+ <string>A7BD6736105AD76D0021B6CF</string>
+ <string>A7BD6754105ADB210021B6CF</string>
+ <string>A7BD67A6105ADF370021B6CF</string>
+ <string>A7BD67A7105ADF370021B6CF</string>
+ <string>A7BD67B1105AE0100021B6CF</string>
+ <string>A7BD684D105AECB40021B6CF</string>
+ <string>A706CE8E105CD9860048E061</string>
+ <string>A706CF06105CE1280048E061</string>
+ <string>A706CFCC105CEB840048E061</string>
+ <string>A706CFDC105CEDB80048E061</string>
+ <string>A706CFDD105CEDB80048E061</string>
+ <string>A706CFF6105CF0660048E061</string>
+ <string>A706D041105CF7900048E061</string>
+ <string>A7A849D6105CFB5300CAD54F</string>
+ <string>A7A84B30105D205000CAD54F</string>
+ <string>A7A84B31105D205000CAD54F</string>
+ <string>A7A84B32105D205000CAD54F</string>
+ <string>A7A84B7A105D60E700CAD54F</string>
+ <string>A7A84B7C105D60E700CAD54F</string>
+ <string>A7A84B90105D61E300CAD54F</string>
+ <string>A7A84B95105D61E300CAD54F</string>
+ <string>A7A84C5C105D6E5B00CAD54F</string>
+ <string>A7A84C7C105D6EDD00CAD54F</string>
+ <string>A7A84D3F105E4BAF00CAD54F</string>
+ <string>A7A84D40105E4BAF00CAD54F</string>
+ <string>A7A84D41105E4BAF00CAD54F</string>
+ <string>A7A84D43105E4BAF00CAD54F</string>
+ <string>A7A84D49105E4BAF00CAD54F</string>
+ <string>A7A84D60105E4C6200CAD54F</string>
+ <string>A7A84D8C105E57AF00CAD54F</string>
+ <string>A7A84DE7105E5F4500CAD54F</string>
+ <string>A7A84DF5105E622E00CAD54F</string>
+ <string>A7A84E2C105E650B00CAD54F</string>
+ <string>A7A84FFA105E912500CAD54F</string>
+ <string>A7A8500F105E930300CAD54F</string>
+ <string>A7A85046105EA37500CAD54F</string>
+ <string>A7E28725105EF31E00344FA9</string>
+ <string>A7E28729105EF31E00344FA9</string>
+ <string>A7E2872A105EF31E00344FA9</string>
+ <string>A7E2872B105EF31E00344FA9</string>
+ <string>A7E28754105EF77E00344FA9</string>
+ <string>A709DDAA105F828C00FD8909</string>
+ <string>A78DE9F4105F86C000786950</string>
+ <string>A78DEA21105F87FE00786950</string>
+ <string>A78DEA22105F87FE00786950</string>
+ <string>A78DEA23105F87FE00786950</string>
+ <string>A78DEA3A105F8AE800786950</string>
+ <string>A78DEA74105F997900786950</string>
+ <string>A78DEA89105F9AC100786950</string>
+ <string>A78DEA8A105F9AC100786950</string>
+ <string>A78DEA94105F9ADD00786950</string>
+ <string>A78DEAB4105F9ED600786950</string>
+ <string>A78DEAD8105FA19E00786950</string>
+ <string>A78DEAF0105FA3DC00786950</string>
+ <string>A78DEAFA105FAE2100786950</string>
+ <string>A78DEB08105FAE5E00786950</string>
+ <string>A78DEB25105FB05900786950</string>
+ <string>A78DEB26105FB05900786950</string>
+ <string>A78DEB27105FB05900786950</string>
+ <string>A78DEB38105FB2A400786950</string>
+ <string>A78DEB39105FB2A400786950</string>
+ <string>A78DEB89105FB68C00786950</string>
+ <string>A78DEBC7105FBE0000786950</string>
+ <string>A78DEBC8105FBE0000786950</string>
+ <string>A78DEBE5105FC04000786950</string>
+ <string>A78DEBE7105FC04000786950</string>
+ <string>A78DEC18105FC4C100786950</string>
+ <string>A78DEC21105FC57D00786950</string>
+ <string>A78DEC2D105FD09800786950</string>
+ <string>A78DEC2E105FD09800786950</string>
+ <string>A78DEC2F105FD09800786950</string>
+ <string>A78DEC30105FD09800786950</string>
+ <string>A78DEC48105FD10B00786950</string>
+ <string>A78DEC5C105FD21600786950</string>
+ <string>A78DEC98105FD83800786950</string>
+ <string>A78DEC9A105FD83800786950</string>
+ <string>A78DECEF105FDC2D00786950</string>
+ <string>A78DED28105FDE6C00786950</string>
+ <string>A78DED47105FDF6200786950</string>
+ <string>A78DED48105FDF6200786950</string>
</array>
</dict>
<key>SplitCount</key>
@@ -831,14 +811,14 @@
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
- <string>{{0, 5}, {963, 622}}</string>
+ <string>{{0, 5}, {963, 445}}</string>
<key>RubberWindowFrame</key>
- <string>565 199 1360 679 0 0 1440 878 </string>
+ <string>63 96 1360 679 0 0 1440 878 </string>
</dict>
<key>Module</key>
<string>PBXNavigatorGroup</string>
<key>Proportion</key>
- <string>622pt</string>
+ <string>445pt</string>
</dict>
<dict>
<key>ContentConfiguration</key>
@@ -851,14 +831,14 @@
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
- <string>{{0, 632}, {963, 6}}</string>
+ <string>{{0, 455}, {963, 183}}</string>
<key>RubberWindowFrame</key>
- <string>565 199 1360 679 0 0 1440 878 </string>
+ <string>63 96 1360 679 0 0 1440 878 </string>
</dict>
<key>Module</key>
<string>XCDetailModule</string>
<key>Proportion</key>
- <string>6pt</string>
+ <string>183pt</string>
</dict>
</array>
<key>Proportion</key>
@@ -878,9 +858,9 @@
</array>
<key>TableOfContents</key>
<array>
- <string>A7F49D001059083700817D3D</string>
+ <string>A78DE9EA105F85D500786950</string>
<string>1CE0B1FE06471DED0097A5F4</string>
- <string>A7F49D011059083700817D3D</string>
+ <string>A78DE9EB105F85D500786950</string>
<string>1CE0B20306471E060097A5F4</string>
<string>1CE0B20306471E060097A5F4</string>
<string>1CE0B20506471E060097A5F4</string>
@@ -1017,19 +997,17 @@
<integer>5</integer>
<key>WindowOrderList</key>
<array>
- <string>A7F49D0F1059083700817D3D</string>
- <string>A7F49D101059083700817D3D</string>
+ <string>1C530D57069F1CE1000CFCEE</string>
+ <string>A78DEA08105F86DD00786950</string>
+ <string>A78DEA01105F86C000786950</string>
<string>1CD10A99069EF8BA00B06720</string>
<string>A78E2B7C0EFA2263002EB6D9</string>
- <string>A7B42C8910568D0B007BC954</string>
- <string>A7B42CC31056914A007BC954</string>
- <string>A7B432281057E293007BC954</string>
- <string>A7B433F7105806C9007BC954</string>
+ <string>A7BD674C105ADA610021B6CF</string>
<string>1C78EAAD065D492600B07095</string>
<string>/Users/Oliver/Documents/iphone/Projects/ASiST/trunk/ASiST.xcodeproj</string>
</array>
<key>WindowString</key>
- <string>565 199 1360 679 0 0 1440 878 </string>
+ <string>63 96 1360 679 0 0 1440 878 </string>
<key>WindowToolsV3</key>
<array>
<dict>
@@ -1045,12 +1023,14 @@
<key>Dock</key>
<array>
<dict>
+ <key>BecomeActive</key>
+ <true/>
<key>ContentConfiguration</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>1CD0528F0623707200166675</string>
<key>PBXProjectModuleLabel</key>
- <string></string>
+ <string>ReportViewController.m</string>
<key>StatusBarVisibility</key>
<true/>
</dict>
@@ -1106,7 +1086,7 @@
<key>TableOfContents</key>
<array>
<string>A78E2B7C0EFA2263002EB6D9</string>
- <string>A7F49D061059083700817D3D</string>
+ <string>A78DE9ED105F85D500786950</string>
<string>1CD0528F0623707200166675</string>
<string>XCMainBuildResultsModuleGUID</string>
</array>
@@ -1200,10 +1180,10 @@
<key>Frame</key>
<string>{{615, 0}, {733, 379}}</string>
<key>RubberWindowFrame</key>
- <string>224 127 1348 751 0 0 1440 878 </string>
+ <string>92 127 1348 751 0 0 1440 878 </string>
</dict>
<key>RubberWindowFrame</key>
- <string>224 127 1348 751 0 0 1440 878 </string>
+ <string>92 127 1348 751 0 0 1440 878 </string>
</dict>
<key>Module</key>
<string>PBXDebugSessionModule</string>
@@ -1226,18 +1206,18 @@
<key>TableOfContents</key>
<array>
<string>1CD10A99069EF8BA00B06720</string>
- <string>A7F49D071059083700817D3D</string>
+ <string>A78DE9F9105F86C000786950</string>
<string>1C162984064C10D400B95A72</string>
- <string>A7F49D081059083700817D3D</string>
- <string>A7F49D091059083700817D3D</string>
- <string>A7F49D0A1059083700817D3D</string>
- <string>A7F49D0B1059083700817D3D</string>
- <string>A7F49D0C1059083700817D3D</string>
+ <string>A78DE9FA105F86C000786950</string>
+ <string>A78DE9FB105F86C000786950</string>
+ <string>A78DE9FC105F86C000786950</string>
+ <string>A78DE9FD105F86C000786950</string>
+ <string>A78DE9FE105F86C000786950</string>
</array>
<key>ToolbarConfiguration</key>
<string>xcode.toolbar.config.debugV3</string>
<key>WindowString</key>
- <string>224 127 1348 751 0 0 1440 878 </string>
+ <string>92 127 1348 751 0 0 1440 878 </string>
<key>WindowToolGUID</key>
<string>1CD10A99069EF8BA00B06720</string>
<key>WindowToolIsVisible</key>
@@ -1259,23 +1239,21 @@
<key>Dock</key>
<array>
<dict>
- <key>BecomeActive</key>
- <true/>
<key>ContentConfiguration</key>
<dict>
<key>PBXProjectModuleGUID</key>
<string>1CDD528C0622207200134675</string>
<key>PBXProjectModuleLabel</key>
- <string>ASiSTAppDelegate.m</string>
+ <string>App.m</string>
<key>StatusBarVisibility</key>
<true/>
</dict>
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
- <string>{{0, 0}, {1130, 44}}</string>
+ <string>{{0, 0}, {1130, 363}}</string>
<key>RubberWindowFrame</key>
- <string>601 462 1130 222 0 0 1440 878 </string>
+ <string>204 212 1130 600 0 0 1440 878 </string>
</dict>
<key>Module</key>
<string>PBXNavigatorGroup</string>
@@ -1284,9 +1262,11 @@
</dict>
</array>
<key>Proportion</key>
- <string>44pt</string>
+ <string>363pt</string>
</dict>
<dict>
+ <key>BecomeActive</key>
+ <true/>
<key>ContentConfiguration</key>
<dict>
<key>PBXProjectModuleGUID</key>
@@ -1297,18 +1277,18 @@
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
- <string>{{0, 49}, {1130, 132}}</string>
+ <string>{{0, 368}, {1130, 191}}</string>
<key>RubberWindowFrame</key>
- <string>601 462 1130 222 0 0 1440 878 </string>
+ <string>204 212 1130 600 0 0 1440 878 </string>
</dict>
<key>Module</key>
<string>PBXProjectFindModule</string>
<key>Proportion</key>
- <string>132pt</string>
+ <string>191pt</string>
</dict>
</array>
<key>Proportion</key>
- <string>181pt</string>
+ <string>559pt</string>
</dict>
</array>
<key>Name</key>
@@ -1322,17 +1302,17 @@
<key>TableOfContents</key>
<array>
<string>1C530D57069F1CE1000CFCEE</string>
- <string>A7B432011057E1C6007BC954</string>
- <string>A7B432021057E1C6007BC954</string>
+ <string>A78DEA6E105F914400786950</string>
+ <string>A78DEA6F105F914400786950</string>
<string>1CDD528C0622207200134675</string>
<string>1CD0528E0623707200166675</string>
</array>
<key>WindowString</key>
- <string>601 462 1130 222 0 0 1440 878 </string>
+ <string>204 212 1130 600 0 0 1440 878 </string>
<key>WindowToolGUID</key>
<string>1C530D57069F1CE1000CFCEE</string>
<key>WindowToolIsVisible</key>
- <true/>
+ <false/>
</dict>
<dict>
<key>Identifier</key>
@@ -1363,18 +1343,18 @@
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
- <string>{{0, 0}, {972, 301}}</string>
+ <string>{{0, 0}, {1227, 503}}</string>
<key>RubberWindowFrame</key>
- <string>459 346 972 342 0 0 1440 878 </string>
+ <string>213 334 1227 544 0 0 1440 878 </string>
</dict>
<key>Module</key>
<string>PBXDebugCLIModule</string>
<key>Proportion</key>
- <string>301pt</string>
+ <string>503pt</string>
</dict>
</array>
<key>Proportion</key>
- <string>301pt</string>
+ <string>503pt</string>
</dict>
</array>
<key>Name</key>
@@ -1388,13 +1368,13 @@
<key>TableOfContents</key>
<array>
<string>1C78EAAD065D492600B07095</string>
- <string>A7F49D0D1059083700817D3D</string>
+ <string>A78DE9FF105F86C000786950</string>
<string>1C78EAAC065D492600B07095</string>
</array>
<key>ToolbarConfiguration</key>
<string>xcode.toolbar.config.consoleV3</string>
<key>WindowString</key>
- <string>459 346 972 342 0 0 1440 878 </string>
+ <string>213 334 1227 544 0 0 1440 878 </string>
<key>WindowToolGUID</key>
<string>1C78EAAD065D492600B07095</string>
<key>WindowToolIsVisible</key>
View
7,900 ASiST.xcodeproj/Oliver.pbxuser
6,083 additions, 1,817 deletions not shown because the diff is too large. Please use a local Git client to view these changes.
View
240 ASiST.xcodeproj/project.pbxproj
@@ -23,11 +23,14 @@
A7006B5D0F3B0A0D009BB6A5 /* ZipArchive.mm in Sources */ = {isa = PBXBuildFile; fileRef = A7006B530F3B0A0C009BB6A5 /* ZipArchive.mm */; };
A700AA9F0F2B5B6C0014885D /* Entitlements.plist in Resources */ = {isa = PBXBuildFile; fileRef = A700AA9E0F2B5B6C0014885D /* Entitlements.plist */; };
A7061AC80F3712A300F605C1 /* ReportAppsController.m in Sources */ = {isa = PBXBuildFile; fileRef = A7061AC70F3712A300F605C1 /* ReportAppsController.m */; };
+ A706CEE5105CDE790048E061 /* NSDictionary+Helpers.m in Sources */ = {isa = PBXBuildFile; fileRef = A706CEE4105CDE790048E061 /* NSDictionary+Helpers.m */; };
+ A706D00B105CF3130048E061 /* ReviewDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = A706D00A105CF3130048E061 /* ReviewDownloaderOperation.m */; };
A707A2BF0FA5BBFA004060D9 /* apps_bw.png in Resources */ = {isa = PBXBuildFile; fileRef = A707A2BB0FA5BBFA004060D9 /* apps_bw.png */; };
A707A2C00FA5BBFA004060D9 /* Graphique_bw.png in Resources */ = {isa = PBXBuildFile; fileRef = A707A2BC0FA5BBFA004060D9 /* Graphique_bw.png */; };
A707A2C10FA5BBFA004060D9 /* Settings_bw.png in Resources */ = {isa = PBXBuildFile; fileRef = A707A2BD0FA5BBFA004060D9 /* Settings_bw.png */; };
A707A2C20FA5BBFA004060D9 /* Report_bw.png in Resources */ = {isa = PBXBuildFile; fileRef = A707A2BE0FA5BBFA004060D9 /* Report_bw.png */; };
A707A3390FA61238004060D9 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = A707A3380FA61238004060D9 /* Default.png */; };
+ A709DD9E105F7C8A00FD8909 /* TableListSelectorView.m in Sources */ = {isa = PBXBuildFile; fileRef = A709DD9D105F7C8A00FD8909 /* TableListSelectorView.m */; };
A70D5A7C0F17A66700A6FE9B /* YahooFinance.m in Sources */ = {isa = PBXBuildFile; fileRef = A70D5A7B0F17A66700A6FE9B /* YahooFinance.m */; };
A72482810F1A0BA3003DADDD /* Report_Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = A724827F0F1A0BA3003DADDD /* Report_Icon.png */; };
A72482820F1A0BA3003DADDD /* Report_Icon_New.png in Resources */ = {isa = PBXBuildFile; fileRef = A72482800F1A0BA3003DADDD /* Report_Icon_New.png */; };
@@ -158,8 +161,6 @@
A76D09860F39BBFE0081C7EF /* ZAR.png in Resources */ = {isa = PBXBuildFile; fileRef = A76D09160F39BBFE0081C7EF /* ZAR.png */; };
A76D09870F39BBFE0081C7EF /* ZMK.png in Resources */ = {isa = PBXBuildFile; fileRef = A76D09170F39BBFE0081C7EF /* ZMK.png */; };
A76D09880F39BBFE0081C7EF /* ZWD.png in Resources */ = {isa = PBXBuildFile; fileRef = A76D09180F39BBFE0081C7EF /* ZWD.png */; };
- A7745A630F06E5C10009DD76 /* ImageManipulator.m in Sources */ = {isa = PBXBuildFile; fileRef = A7745A620F06E5C10009DD76 /* ImageManipulator.m */; };
- A7745B370F06F0B30009DD76 /* ImageResizing.m in Sources */ = {isa = PBXBuildFile; fileRef = A7745B360F06F0B30009DD76 /* ImageResizing.m */; };
A7745D8F0F08D49C0009DD76 /* AsyncSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = A7745D800F08D49C0009DD76 /* AsyncSocket.m */; };
A7745D900F08D49C0009DD76 /* DDData.m in Sources */ = {isa = PBXBuildFile; fileRef = A7745D820F08D49C0009DD76 /* DDData.m */; };
A7745D910F08D49C0009DD76 /* DDNumber.m in Sources */ = {isa = PBXBuildFile; fileRef = A7745D840F08D49C0009DD76 /* DDNumber.m */; };
@@ -177,11 +178,43 @@
A780D1C70F26219800C796FB /* Query.m in Sources */ = {isa = PBXBuildFile; fileRef = A780D1C60F26219800C796FB /* Query.m */; };
A780D7680F278EF900C796FB /* AxisView.m in Sources */ = {isa = PBXBuildFile; fileRef = A780D7670F278EF900C796FB /* AxisView.m */; };
A780DF000F285FAB00C796FB /* LegendView.m in Sources */ = {isa = PBXBuildFile; fileRef = A780DEFF0F285FAB00C796FB /* LegendView.m */; };
+ A78DEB2F105FB1B700786950 /* up.png in Resources */ = {isa = PBXBuildFile; fileRef = A78DEB2D105FB1B700786950 /* up.png */; };
+ A78DEB30105FB1B700786950 /* down.png in Resources */ = {isa = PBXBuildFile; fileRef = A78DEB2E105FB1B700786950 /* down.png */; };
+ A78DEC97105FD83400786950 /* update_2_to_3.sql in Resources */ = {isa = PBXBuildFile; fileRef = A78DEC96105FD81E00786950 /* update_2_to_3.sql */; };
+ A78DED39105FDEF800786950 /* DOM.png in Resources */ = {isa = PBXBuildFile; fileRef = A78DED2D105FDEF800786950 /* DOM.png */; };
+ A78DED3A105FDEF800786950 /* ECU.png in Resources */ = {isa = PBXBuildFile; fileRef = A78DED2E105FDEF800786950 /* ECU.png */; };
+ A78DED3B105FDEF800786950 /* EGY.png in Resources */ = {isa = PBXBuildFile; fileRef = A78DED2F105FDEF800786950 /* EGY.png */; };
+ A78DED3C105FDEF800786950 /* EST.png in Resources */ = {isa = PBXBuildFile; fileRef = A78DED30105FDEF800786950 /* EST.png */; };
+ A78DED3D105FDEF800786950 /* HND.png in Resources */ = {isa = PBXBuildFile; fileRef = A78DED31105FDEF800786950 /* HND.png */; };
+ A78DED3E105FDEF800786950 /* JAM.png in Resources */ = {isa = PBXBuildFile; fileRef = A78DED32105FDEF800786950 /* JAM.png */; };
+ A78DED3F105FDEF800786950 /* KAZ.png in Resources */ = {isa = PBXBuildFile; fileRef = A78DED33105FDEF800786950 /* KAZ.png */; };
+ A78DED40105FDEF800786950 /* LTU.png in Resources */ = {isa = PBXBuildFile; fileRef = A78DED34105FDEF800786950 /* LTU.png */; };
+ A78DED41105FDEF800786950 /* LVA.png in Resources */ = {isa = PBXBuildFile; fileRef = A78DED35105FDEF800786950 /* LVA.png */; };
+ A78DED42105FDEF800786950 /* MAC.png in Resources */ = {isa = PBXBuildFile; fileRef = A78DED36105FDEF800786950 /* MAC.png */; };
+ A78DED43105FDEF800786950 /* MDA.png in Resources */ = {isa = PBXBuildFile; fileRef = A78DED37105FDEF800786950 /* MDA.png */; };
+ A78DED44105FDEF800786950 /* URY.png in Resources */ = {isa = PBXBuildFile; fileRef = A78DED38105FDEF800786950 /* URY.png */; };
A78E2C3D0EFA7EB3002EB6D9 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A78E2C3C0EFA7EB3002EB6D9 /* libz.dylib */; };
A79D81F60EFEA913006C37FC /* AppViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A79D81F50EFEA913006C37FC /* AppViewController.m */; };
A79D89000F029628006C37FC /* Sale.m in Sources */ = {isa = PBXBuildFile; fileRef = A79D88FF0F029628006C37FC /* Sale.m */; };
A79D8D6E0F0562DB006C37FC /* apps.png in Resources */ = {isa = PBXBuildFile; fileRef = A79D8D6D0F0562DB006C37FC /* apps.png */; };
A79D8D700F056389006C37FC /* reports.png in Resources */ = {isa = PBXBuildFile; fileRef = A79D8D6F0F056389006C37FC /* reports.png */; };
+ A7A84B23105D1F3700CAD54F /* AppDetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A7A84B22105D1F3700CAD54F /* AppDetailViewController.m */; };
+ A7A84BC1105D64B500CAD54F /* ReviewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = A7A84BC0105D64B500CAD54F /* ReviewCell.m */; };
+ A7A84C1C105D6A4D00CAD54F /* 0star_16.png in Resources */ = {isa = PBXBuildFile; fileRef = A7A84C11105D6A4D00CAD54F /* 0star_16.png */; };
+ A7A84C1D105D6A4D00CAD54F /* 1star.png in Resources */ = {isa = PBXBuildFile; fileRef = A7A84C12105D6A4D00CAD54F /* 1star.png */; };
+ A7A84C1E105D6A4D00CAD54F /* 1star_16.png in Resources */ = {isa = PBXBuildFile; fileRef = A7A84C13105D6A4D00CAD54F /* 1star_16.png */; };
+ A7A84C1F105D6A4D00CAD54F /* 2stars.png in Resources */ = {isa = PBXBuildFile; fileRef = A7A84C14105D6A4D00CAD54F /* 2stars.png */; };
+ A7A84C20105D6A4D00CAD54F /* 2stars_16.png in Resources */ = {isa = PBXBuildFile; fileRef = A7A84C15105D6A4D00CAD54F /* 2stars_16.png */; };
+ A7A84C21105D6A4D00CAD54F /* 3stars.png in Resources */ = {isa = PBXBuildFile; fileRef = A7A84C16105D6A4D00CAD54F /* 3stars.png */; };
+ A7A84C22105D6A4D00CAD54F /* 3stars_16.png in Resources */ = {isa = PBXBuildFile; fileRef = A7A84C17105D6A4D00CAD54F /* 3stars_16.png */; };
+ A7A84C23105D6A4D00CAD54F /* 4stars.png in Resources */ = {isa = PBXBuildFile; fileRef = A7A84C18105D6A4D00CAD54F /* 4stars.png */; };
+ A7A84C24105D6A4D00CAD54F /* 4stars_16.png in Resources */ = {isa = PBXBuildFile; fileRef = A7A84C19105D6A4D00CAD54F /* 4stars_16.png */; };
+ A7A84C25105D6A4D00CAD54F /* 5stars.png in Resources */ = {isa = PBXBuildFile; fileRef = A7A84C1A105D6A4D00CAD54F /* 5stars.png */; };
+ A7A84C26105D6A4D00CAD54F /* 5stars_16.png in Resources */ = {isa = PBXBuildFile; fileRef = A7A84C1B105D6A4D00CAD54F /* 5stars_16.png */; };
+ A7A84CB2105E18D200CAD54F /* ItunesConnectDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = A7A84CB1105E18D200CAD54F /* ItunesConnectDownloaderOperation.m */; };
+ A7A84CEF105E353700CAD54F /* NSArray+Reports.m in Sources */ = {isa = PBXBuildFile; fileRef = A7A84CEE105E353700CAD54F /* NSArray+Reports.m */; };
+ A7A84CF2105E379200CAD54F /* NSDate+Helpers.m in Sources */ = {isa = PBXBuildFile; fileRef = A7A84CF1105E379200CAD54F /* NSDate+Helpers.m */; };
+ A7A84D0E105E405100CAD54F /* SynchingManager.m in Sources */ = {isa = PBXBuildFile; fileRef = A7A84D0D105E405100CAD54F /* SynchingManager.m */; };
A7AB06CD0F308F2200085D99 /* ARE.png in Resources */ = {isa = PBXBuildFile; fileRef = A7AB06930F308F2200085D99 /* ARE.png */; };
A7AB06CE0F308F2200085D99 /* ARG.png in Resources */ = {isa = PBXBuildFile; fileRef = A7AB06940F308F2200085D99 /* ARG.png */; };
A7AB06CF0F308F2200085D99 /* AUS.png in Resources */ = {isa = PBXBuildFile; fileRef = A7AB06950F308F2200085D99 /* AUS.png */; };
@@ -263,7 +296,12 @@
A7B8DD030F1F8E1B00DC09E1 /* KeychainWrapper.m in Sources */ = {isa = PBXBuildFile; fileRef = A7B8DD020F1F8E1B00DC09E1 /* KeychainWrapper.m */; };
A7B8DDE10F1FC88100DC09E1 /* TableListView.m in Sources */ = {isa = PBXBuildFile; fileRef = A7B8DDE00F1FC88100DC09E1 /* TableListView.m */; };
A7BB984C0F3C13B0008AC1B4 /* Currencies.plist in Resources */ = {isa = PBXBuildFile; fileRef = A7BB984B0F3C13B0008AC1B4 /* Currencies.plist */; };
+ A7BD65DA105AB47B0021B6CF /* Review.m in Sources */ = {isa = PBXBuildFile; fileRef = A7BD65D9105AB47B0021B6CF /* Review.m */; };
+ A7BD6699105AC9C80021B6CF /* update_1_to_2.sql in Resources */ = {isa = PBXBuildFile; fileRef = A7BD65DB105AB4D00021B6CF /* update_1_to_2.sql */; };
+ A7BD6849105AEC920021B6CF /* ISO8601DateFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = A7BD6848105AEC920021B6CF /* ISO8601DateFormatter.m */; };
A7C7E92B10459E3000D413D0 /* DayReportCell.m in Sources */ = {isa = PBXBuildFile; fileRef = A7C7E92A10459E3000D413D0 /* DayReportCell.m */; };
+ A7CD0666105A7014005F9166 /* cover_mask_rounded_100x100.png in Resources */ = {isa = PBXBuildFile; fileRef = A7CD0665105A7014005F9166 /* cover_mask_rounded_100x100.png */; };
+ A7CD06EA105A7882005F9166 /* UIImage+Helpers.m in Sources */ = {isa = PBXBuildFile; fileRef = A7CD06E9105A7882005F9166 /* UIImage+Helpers.m */; };
A7EB519410481BE6005452BE /* Database.m in Sources */ = {isa = PBXBuildFile; fileRef = A7EB519310481BE6005452BE /* Database.m */; };
A7EB5259104825F9005452BE /* update_0_to_1.sql in Resources */ = {isa = PBXBuildFile; fileRef = A7EB5258104825F9005452BE /* update_0_to_1.sql */; };
A7EDD2FE0FA4E2C50079FE78 /* SettingsViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = A7EDD2FA0FA4E2C50079FE78 /* SettingsViewController.xib */; };
@@ -308,11 +346,17 @@
A700AA9E0F2B5B6C0014885D /* Entitlements.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Entitlements.plist; sourceTree = "<group>"; };
A7061AC60F3712A300F605C1 /* ReportAppsController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReportAppsController.h; sourceTree = "<group>"; };
A7061AC70F3712A300F605C1 /* ReportAppsController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ReportAppsController.m; sourceTree = "<group>"; };
+ A706CEE3105CDE790048E061 /* NSDictionary+Helpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDictionary+Helpers.h"; sourceTree = "<group>"; };
+ A706CEE4105CDE790048E061 /* NSDictionary+Helpers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDictionary+Helpers.m"; sourceTree = "<group>"; };
+ A706D009105CF3130048E061 /* ReviewDownloaderOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReviewDownloaderOperation.h; sourceTree = "<group>"; };
+ A706D00A105CF3130048E061 /* ReviewDownloaderOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ReviewDownloaderOperation.m; sourceTree = "<group>"; };
A707A2BB0FA5BBFA004060D9 /* apps_bw.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = apps_bw.png; sourceTree = "<group>"; };
A707A2BC0FA5BBFA004060D9 /* Graphique_bw.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Graphique_bw.png; sourceTree = "<group>"; };
A707A2BD0FA5BBFA004060D9 /* Settings_bw.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Settings_bw.png; sourceTree = "<group>"; };
A707A2BE0FA5BBFA004060D9 /* Report_bw.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Report_bw.png; sourceTree = "<group>"; };
A707A3380FA61238004060D9 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = "<group>"; };
+ A709DD9C105F7C8A00FD8909 /* TableListSelectorView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TableListSelectorView.h; sourceTree = "<group>"; };
+ A709DD9D105F7C8A00FD8909 /* TableListSelectorView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TableListSelectorView.m; sourceTree = "<group>"; };
A70D5A7A0F17A66700A6FE9B /* YahooFinance.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YahooFinance.h; sourceTree = "<group>"; };
A70D5A7B0F17A66700A6FE9B /* YahooFinance.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YahooFinance.m; sourceTree = "<group>"; };
A724827F0F1A0BA3003DADDD /* Report_Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Report_Icon.png; sourceTree = "<group>"; };
@@ -450,10 +494,6 @@
A76D09160F39BBFE0081C7EF /* ZAR.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ZAR.png; sourceTree = "<group>"; };
A76D09170F39BBFE0081C7EF /* ZMK.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ZMK.png; sourceTree = "<group>"; };
A76D09180F39BBFE0081C7EF /* ZWD.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ZWD.png; sourceTree = "<group>"; };
- A7745A610F06E5C00009DD76 /* ImageManipulator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImageManipulator.h; sourceTree = "<group>"; };
- A7745A620F06E5C10009DD76 /* ImageManipulator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ImageManipulator.m; sourceTree = "<group>"; };
- A7745B350F06F0B30009DD76 /* ImageResizing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImageResizing.h; sourceTree = "<group>"; };
- A7745B360F06F0B30009DD76 /* ImageResizing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ImageResizing.m; sourceTree = "<group>"; };
A7745D7F0F08D49C0009DD76 /* AsyncSocket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AsyncSocket.h; sourceTree = "<group>"; };
A7745D800F08D49C0009DD76 /* AsyncSocket.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AsyncSocket.m; sourceTree = "<group>"; };
A7745D810F08D49C0009DD76 /* DDData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DDData.h; sourceTree = "<group>"; };
@@ -487,13 +527,51 @@
A780D7670F278EF900C796FB /* AxisView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AxisView.m; sourceTree = "<group>"; };
A780DEFE0F285FAB00C796FB /* LegendView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LegendView.h; sourceTree = "<group>"; };
A780DEFF0F285FAB00C796FB /* LegendView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LegendView.m; sourceTree = "<group>"; };
+ A78DEB2D105FB1B700786950 /* up.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = up.png; sourceTree = "<group>"; };
+ A78DEB2E105FB1B700786950 /* down.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = down.png; sourceTree = "<group>"; };
+ A78DEC96105FD81E00786950 /* update_2_to_3.sql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = update_2_to_3.sql; sourceTree = "<group>"; };
+ A78DED2D105FDEF800786950 /* DOM.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = DOM.png; sourceTree = "<group>"; };
+ A78DED2E105FDEF800786950 /* ECU.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ECU.png; sourceTree = "<group>"; };
+ A78DED2F105FDEF800786950 /* EGY.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = EGY.png; sourceTree = "<group>"; };
+ A78DED30105FDEF800786950 /* EST.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = EST.png; sourceTree = "<group>"; };
+ A78DED31105FDEF800786950 /* HND.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = HND.png; sourceTree = "<group>"; };
+ A78DED32105FDEF800786950 /* JAM.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = JAM.png; sourceTree = "<group>"; };
+ A78DED33105FDEF800786950 /* KAZ.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = KAZ.png; sourceTree = "<group>"; };
+ A78DED34105FDEF800786950 /* LTU.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = LTU.png; sourceTree = "<group>"; };
+ A78DED35105FDEF800786950 /* LVA.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = LVA.png; sourceTree = "<group>"; };
+ A78DED36105FDEF800786950 /* MAC.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = MAC.png; sourceTree = "<group>"; };
+ A78DED37105FDEF800786950 /* MDA.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = MDA.png; sourceTree = "<group>"; };
+ A78DED38105FDEF800786950 /* URY.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = URY.png; sourceTree = "<group>"; };
A78E2C3C0EFA7EB3002EB6D9 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; };
A79D81F40EFEA913006C37FC /* AppViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppViewController.h; sourceTree = "<group>"; };
A79D81F50EFEA913006C37FC /* AppViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppViewController.m; sourceTree = "<group>"; };
A79D88FE0F029628006C37FC /* Sale.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Sale.h; sourceTree = "<group>"; };
A79D88FF0F029628006C37FC /* Sale.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Sale.m; sourceTree = "<group>"; };
A79D8D6D0F0562DB006C37FC /* apps.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = apps.png; sourceTree = "<group>"; };
A79D8D6F0F056389006C37FC /* reports.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = reports.png; sourceTree = "<group>"; };
+ A7A84B21105D1F3700CAD54F /* AppDetailViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDetailViewController.h; sourceTree = "<group>"; };
+ A7A84B22105D1F3700CAD54F /* AppDetailViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDetailViewController.m; sourceTree = "<group>"; };
+ A7A84BBF105D64B500CAD54F /* ReviewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReviewCell.h; sourceTree = "<group>"; };
+ A7A84BC0105D64B500CAD54F /* ReviewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ReviewCell.m; sourceTree = "<group>"; };
+ A7A84C11105D6A4D00CAD54F /* 0star_16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 0star_16.png; sourceTree = "<group>"; };
+ A7A84C12105D6A4D00CAD54F /* 1star.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 1star.png; sourceTree = "<group>"; };
+ A7A84C13105D6A4D00CAD54F /* 1star_16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 1star_16.png; sourceTree = "<group>"; };
+ A7A84C14105D6A4D00CAD54F /* 2stars.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 2stars.png; sourceTree = "<group>"; };
+ A7A84C15105D6A4D00CAD54F /* 2stars_16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 2stars_16.png; sourceTree = "<group>"; };
+ A7A84C16105D6A4D00CAD54F /* 3stars.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 3stars.png; sourceTree = "<group>"; };
+ A7A84C17105D6A4D00CAD54F /* 3stars_16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 3stars_16.png; sourceTree = "<group>"; };
+ A7A84C18105D6A4D00CAD54F /* 4stars.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 4stars.png; sourceTree = "<group>"; };
+ A7A84C19105D6A4D00CAD54F /* 4stars_16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 4stars_16.png; sourceTree = "<group>"; };
+ A7A84C1A105D6A4D00CAD54F /* 5stars.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 5stars.png; sourceTree = "<group>"; };
+ A7A84C1B105D6A4D00CAD54F /* 5stars_16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 5stars_16.png; sourceTree = "<group>"; };
+ A7A84CB0105E18D200CAD54F /* ItunesConnectDownloaderOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ItunesConnectDownloaderOperation.h; sourceTree = "<group>"; };
+ A7A84CB1105E18D200CAD54F /* ItunesConnectDownloaderOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ItunesConnectDownloaderOperation.m; sourceTree = "<group>"; };
+ A7A84CED105E353700CAD54F /* NSArray+Reports.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSArray+Reports.h"; path = "../NSArray+Reports.h"; sourceTree = "<group>"; };
+ A7A84CEE105E353700CAD54F /* NSArray+Reports.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSArray+Reports.m"; path = "../NSArray+Reports.m"; sourceTree = "<group>"; };
+ A7A84CF0105E379200CAD54F /* NSDate+Helpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDate+Helpers.h"; sourceTree = "<group>"; };
+ A7A84CF1105E379200CAD54F /* NSDate+Helpers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDate+Helpers.m"; sourceTree = "<group>"; };
+ A7A84D0C105E405100CAD54F /* SynchingManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SynchingManager.h; sourceTree = "<group>"; };
+ A7A84D0D105E405100CAD54F /* SynchingManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SynchingManager.m; sourceTree = "<group>"; };
A7AB06930F308F2200085D99 /* ARE.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ARE.png; sourceTree = "<group>"; };
A7AB06940F308F2200085D99 /* ARG.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ARG.png; sourceTree = "<group>"; };
A7AB06950F308F2200085D99 /* AUS.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = AUS.png; sourceTree = "<group>"; };
@@ -588,8 +666,16 @@
A7B8DDDF0F1FC88100DC09E1 /* TableListView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TableListView.h; sourceTree = "<group>"; };
A7B8DDE00F1FC88100DC09E1 /* TableListView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TableListView.m; sourceTree = "<group>"; };
A7BB984B0F3C13B0008AC1B4 /* Currencies.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Currencies.plist; sourceTree = "<group>"; };
+ A7BD65D8105AB47B0021B6CF /* Review.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Review.h; sourceTree = "<group>"; };
+ A7BD65D9105AB47B0021B6CF /* Review.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Review.m; sourceTree = "<group>"; };
+ A7BD65DB105AB4D00021B6CF /* update_1_to_2.sql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = update_1_to_2.sql; sourceTree = "<group>"; };
+ A7BD6847105AEC920021B6CF /* ISO8601DateFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ISO8601DateFormatter.h; sourceTree = "<group>"; };
+ A7BD6848105AEC920021B6CF /* ISO8601DateFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ISO8601DateFormatter.m; sourceTree = "<group>"; };
A7C7E92910459E3000D413D0 /* DayReportCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DayReportCell.h; sourceTree = "<group>"; };
A7C7E92A10459E3000D413D0 /* DayReportCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DayReportCell.m; sourceTree = "<group>"; };
+ A7CD0665105A7014005F9166 /* cover_mask_rounded_100x100.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = cover_mask_rounded_100x100.png; sourceTree = "<group>"; };
+ A7CD06E8105A7882005F9166 /* UIImage+Helpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+Helpers.h"; sourceTree = "<group>"; };
+ A7CD06E9105A7882005F9166 /* UIImage+Helpers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+Helpers.m"; sourceTree = "<group>"; };
A7EB519210481BE6005452BE /* Database.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Database.h; sourceTree = "<group>"; };
A7EB519310481BE6005452BE /* Database.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Database.m; sourceTree = "<group>"; };
A7EB5258104825F9005452BE /* update_0_to_1.sql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = update_0_to_1.sql; sourceTree = "<group>"; };
@@ -633,7 +719,7 @@
080E96DDFE201D6D7F000001 /* Classes */ = {
isa = PBXGroup;
children = (
- A7B4331F1057F11A007BC954 /* Report Server Connectors */,
+ A7A84EEA105E762B00CAD54F /* Sync */,
A7B42AF910564D53007BC954 /* Account Manager */,
A73CEBC510444425008778BF /* Views */,
A7248AC60F1BEEEA003DADDD /* Tableview Cells */,
@@ -759,8 +845,8 @@
A7B434DF1058C98E007BC954 /* PIN Lock */,
A79D81F40EFEA913006C37FC /* AppViewController.h */,
A79D81F50EFEA913006C37FC /* AppViewController.m */,
- A7061AC60F3712A300F605C1 /* ReportAppsController.h */,
- A7061AC70F3712A300F605C1 /* ReportAppsController.m */,
+ A7A84B21105D1F3700CAD54F /* AppDetailViewController.h */,
+ A7A84B22105D1F3700CAD54F /* AppDetailViewController.m */,
A7EDD37F0FA4E8C40079FE78 /* GenericReportController.h */,
A7EDD3800FA4E8C40079FE78 /* GenericReportController.m */,
A7325B9E0F21C9920053AEB1 /* ReportRootController.h */,
@@ -769,6 +855,8 @@
28C286E00D94DF7D0034E888 /* RootViewController.m */,
A7EDD3870FA4E8C40079FE78 /* ReportViewController.h */,
A7EDD3880FA4E8C40079FE78 /* ReportViewController.m */,
+ A7061AC60F3712A300F605C1 /* ReportAppsController.h */,
+ A7061AC70F3712A300F605C1 /* ReportAppsController.m */,
A780D1330F25D1A100C796FB /* ChartRootController.h */,
A780D1340F25D1A100C796FB /* ChartRootController.m */,
A780D16E0F25D2D400C796FB /* ChartViewController.h */,
@@ -779,6 +867,8 @@
A7B8DDE00F1FC88100DC09E1 /* TableListView.m */,
A7B42C1E10567F2C007BC954 /* EditAccountController.h */,
A7B42C1F10567F2C007BC954 /* EditAccountController.m */,
+ A709DD9C105F7C8A00FD8909 /* TableListSelectorView.h */,
+ A709DD9D105F7C8A00FD8909 /* TableListSelectorView.m */,
);
name = "View Controllers";
sourceTree = "<group>";
@@ -923,6 +1013,8 @@
A7C7E92A10459E3000D413D0 /* DayReportCell.m */,
A7B42DA010569AFB007BC954 /* PushButtonCell.h */,
A7B42DA110569AFB007BC954 /* PushButtonCell.m */,
+ A7A84BBF105D64B500CAD54F /* ReviewCell.h */,
+ A7A84BC0105D64B500CAD54F /* ReviewCell.m */,
);
name = "Tableview Cells";
sourceTree = "<group>";
@@ -940,6 +1032,8 @@
A74A71D40EFB0651003B5191 /* Database */ = {
isa = PBXGroup;
children = (
+ A7BD65D8105AB47B0021B6CF /* Review.h */,
+ A7BD65D9105AB47B0021B6CF /* Review.m */,
A7EDD3830FA4E8C40079FE78 /* Country.h */,
A7EDD3840FA4E8C40079FE78 /* Country.m */,
A74A75070EFD5FA3003B5191 /* apps.db */,
@@ -990,19 +1084,58 @@
A79272500F2D95F9009AF9B2 /* Helpers */ = {
isa = PBXGroup;
children = (
- A7745A610F06E5C00009DD76 /* ImageManipulator.h */,
- A7745A620F06E5C10009DD76 /* ImageManipulator.m */,
- A7745B350F06F0B30009DD76 /* ImageResizing.h */,
- A7745B360F06F0B30009DD76 /* ImageResizing.m */,
+ A7A84CED105E353700CAD54F /* NSArray+Reports.h */,
+ A7A84CEE105E353700CAD54F /* NSArray+Reports.m */,
A7ACC3210FE6290E0014DB41 /* NSString+Helpers.h */,
A7ACC3220FE6290E0014DB41 /* NSString+Helpers.m */,
+ A7CD06E8105A7882005F9166 /* UIImage+Helpers.h */,
+ A7CD06E9105A7882005F9166 /* UIImage+Helpers.m */,
+ A7BD6847105AEC920021B6CF /* ISO8601DateFormatter.h */,
+ A7BD6848105AEC920021B6CF /* ISO8601DateFormatter.m */,
+ A706CEE3105CDE790048E061 /* NSDictionary+Helpers.h */,
+ A706CEE4105CDE790048E061 /* NSDictionary+Helpers.m */,
+ A7A84CF0105E379200CAD54F /* NSDate+Helpers.h */,
+ A7A84CF1105E379200CAD54F /* NSDate+Helpers.m */,
);
name = Helpers;
sourceTree = "<group>";
};
+ A7A84C10105D6A4D00CAD54F /* Star Images */ = {
+ isa = PBXGroup;
+ children = (
+ A7A84C11105D6A4D00CAD54F /* 0star_16.png */,
+ A7A84C12105D6A4D00CAD54F /* 1star.png */,
+ A7A84C13105D6A4D00CAD54F /* 1star_16.png */,
+ A7A84C14105D6A4D00CAD54F /* 2stars.png */,
+ A7A84C15105D6A4D00CAD54F /* 2stars_16.png */,
+ A7A84C16105D6A4D00CAD54F /* 3stars.png */,
+ A7A84C17105D6A4D00CAD54F /* 3stars_16.png */,
+ A7A84C18105D6A4D00CAD54F /* 4stars.png */,
+ A7A84C19105D6A4D00CAD54F /* 4stars_16.png */,
+ A7A84C1A105D6A4D00CAD54F /* 5stars.png */,
+ A7A84C1B105D6A4D00CAD54F /* 5stars_16.png */,
+ );
+ path = "Star Images";
+ sourceTree = "<group>";
+ };
+ A7A84EEA105E762B00CAD54F /* Sync */ = {
+ isa = PBXGroup;
+ children = (
+ A7B4331F1057F11A007BC954 /* Report Server Connectors */,
+ A7BD65DC105AB6A60021B6CF /* Review Scraper */,
+ A7A84D0C105E405100CAD54F /* SynchingManager.h */,
+ A7A84D0D105E405100CAD54F /* SynchingManager.m */,
+ );
+ name = Sync;
+ sourceTree = "<group>";
+ };
A7B3B4030F169C9100D211A0 /* artwork */ = {
isa = PBXGroup;
children = (
+ A78DEB2D105FB1B700786950 /* up.png */,
+ A78DEB2E105FB1B700786950 /* down.png */,
+ A7A84C10105D6A4D00CAD54F /* Star Images */,
+ A7CD0665105A7014005F9166 /* cover_mask_rounded_100x100.png */,
A7B42E341056A190007BC954 /* button_red.png */,
A73CEB37104340A5008778BF /* EmptyNano.png */,
A707A3380FA61238004060D9 /* Default.png */,
@@ -1028,6 +1161,18 @@
A7B3B4040F169CA000D211A0 /* countries */ = {
isa = PBXGroup;
children = (
+ A78DED2D105FDEF800786950 /* DOM.png */,
+ A78DED2E105FDEF800786950 /* ECU.png */,
+ A78DED2F105FDEF800786950 /* EGY.png */,
+ A78DED30105FDEF800786950 /* EST.png */,
+ A78DED31105FDEF800786950 /* HND.png */,
+ A78DED32105FDEF800786950 /* JAM.png */,
+ A78DED33105FDEF800786950 /* KAZ.png */,
+ A78DED34105FDEF800786950 /* LTU.png */,
+ A78DED35105FDEF800786950 /* LVA.png */,
+ A78DED36105FDEF800786950 /* MAC.png */,
+ A78DED37105FDEF800786950 /* MDA.png */,
+ A78DED38105FDEF800786950 /* URY.png */,
A7EDD3790FA4E75B0079FE78 /* MLT.png */,
A7AB0B880F3120B500085D99 /* LKA.png */,
A7AB0B890F3120B500085D99 /* PAN.png */,
@@ -1114,6 +1259,8 @@
children = (
A7EDD37D0FA4E8C40079FE78 /* iTunesConnect.h */,
A7EDD37E0FA4E8C40079FE78 /* iTunesConnect.m */,
+ A7A84CB0105E18D200CAD54F /* ItunesConnectDownloaderOperation.h */,
+ A7A84CB1105E18D200CAD54F /* ItunesConnectDownloaderOperation.m */,
);
name = "Report Server Connectors";
sourceTree = "<group>";
@@ -1129,11 +1276,22 @@
name = "PIN Lock";
sourceTree = "<group>";
};
+ A7BD65DC105AB6A60021B6CF /* Review Scraper */ = {
+ isa = PBXGroup;
+ children = (
+ A706D009105CF3130048E061 /* ReviewDownloaderOperation.h */,
+ A706D00A105CF3130048E061 /* ReviewDownloaderOperation.m */,
+ );
+ name = "Review Scraper";
+ sourceTree = "<group>";
+ };
A7EB524F104825E3005452BE /* SQL Scripts */ = {
isa = PBXGroup;
children = (
A74A71D10EFB0644003B5191 /* schema.sql */,
A7EB5258104825F9005452BE /* update_0_to_1.sql */,
+ A7BD65DB105AB4D00021B6CF /* update_1_to_2.sql */,
+ A78DEC96105FD81E00786950 /* update_2_to_3.sql */,
);
name = "SQL Scripts";
sourceTree = "<group>";
@@ -1393,6 +1551,34 @@
A7B42E351056A190007BC954 /* button_red.png in Resources */,
A7B434ED1058D1BF007BC954 /* Pin_Set.png in Resources */,
A7B434EE1058D1BF007BC954 /* Pin_Free.png in Resources */,
+ A7CD0666105A7014005F9166 /* cover_mask_rounded_100x100.png in Resources */,
+ A7BD6699105AC9C80021B6CF /* update_1_to_2.sql in Resources */,
+ A7A84C1C105D6A4D00CAD54F /* 0star_16.png in Resources */,
+ A7A84C1D105D6A4D00CAD54F /* 1star.png in Resources */,
+ A7A84C1E105D6A4D00CAD54F /* 1star_16.png in Resources */,
+ A7A84C1F105D6A4D00CAD54F /* 2stars.png in Resources */,
+ A7A84C20105D6A4D00CAD54F /* 2stars_16.png in Resources */,
+ A7A84C21105D6A4D00CAD54F /* 3stars.png in Resources */,
+ A7A84C22105D6A4D00CAD54F /* 3stars_16.png in Resources */,
+ A7A84C23105D6A4D00CAD54F /* 4stars.png in Resources */,
+ A7A84C24105D6A4D00CAD54F /* 4stars_16.png in Resources */,
+ A7A84C25105D6A4D00CAD54F /* 5stars.png in Resources */,
+ A7A84C26105D6A4D00CAD54F /* 5stars_16.png in Resources */,
+ A78DEB2F105FB1B700786950 /* up.png in Resources */,
+ A78DEB30105FB1B700786950 /* down.png in Resources */,
+ A78DEC97105FD83400786950 /* update_2_to_3.sql in Resources */,
+ A78DED39105FDEF800786950 /* DOM.png in Resources */,
+ A78DED3A105FDEF800786950 /* ECU.png in Resources */,
+ A78DED3B105FDEF800786950 /* EGY.png in Resources */,
+ A78DED3C105FDEF800786950 /* EST.png in Resources */,
+ A78DED3D105FDEF800786950 /* HND.png in Resources */,
+ A78DED3E105FDEF800786950 /* JAM.png in Resources */,
+ A78DED3F105FDEF800786950 /* KAZ.png in Resources */,
+ A78DED40105FDEF800786950 /* LTU.png in Resources */,
+ A78DED41105FDEF800786950 /* LVA.png in Resources */,
+ A78DED42105FDEF800786950 /* MAC.png in Resources */,
+ A78DED43105FDEF800786950 /* MDA.png in Resources */,
+ A78DED44105FDEF800786950 /* URY.png in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -1409,8 +1595,6 @@
A74A75470EFD7117003B5191 /* App.m in Sources */,
A79D81F60EFEA913006C37FC /* AppViewController.m in Sources */,
A79D89000F029628006C37FC /* Sale.m in Sources */,
- A7745A630F06E5C10009DD76 /* ImageManipulator.m in Sources */,
- A7745B370F06F0B30009DD76 /* ImageResizing.m in Sources */,
A7745D8F0F08D49C0009DD76 /* AsyncSocket.m in Sources */,
A7745D900F08D49C0009DD76 /* DDData.m in Sources */,
A7745D910F08D49C0009DD76 /* DDNumber.m in Sources */,
@@ -1460,6 +1644,18 @@
A7B42C2010567F2C007BC954 /* EditAccountController.m in Sources */,
A7B42DA210569AFB007BC954 /* PushButtonCell.m in Sources */,
A7B434E21058C9AC007BC954 /* PinLockController.m in Sources */,
+ A7CD06EA105A7882005F9166 /* UIImage+Helpers.m in Sources */,
+ A7BD65DA105AB47B0021B6CF /* Review.m in Sources */,
+ A7BD6849105AEC920021B6CF /* ISO8601DateFormatter.m in Sources */,
+ A706CEE5105CDE790048E061 /* NSDictionary+Helpers.m in Sources */,
+ A706D00B105CF3130048E061 /* ReviewDownloaderOperation.m in Sources */,
+ A7A84B23105D1F3700CAD54F /* AppDetailViewController.m in Sources */,
+ A7A84BC1105D64B500CAD54F /* ReviewCell.m in Sources */,
+ A7A84CB2105E18D200CAD54F /* ItunesConnectDownloaderOperation.m in Sources */,
+ A7A84CEF105E353700CAD54F /* NSArray+Reports.m in Sources */,
+ A7A84CF2105E379200CAD54F /* NSDate+Helpers.m in Sources */,
+ A7A84D0E105E405100CAD54F /* SynchingManager.m in Sources */,
+ A709DD9E105F7C8A00FD8909 /* TableListSelectorView.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -1518,10 +1714,10 @@
GCC_TREAT_WARNINGS_AS_ERRORS = NO;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- ONLY_ACTIVE_ARCH = NO;
+ ONLY_ACTIVE_ARCH = YES;
PREBINDING = NO;
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "";
- SDKROOT = iphoneos2.0;
+ SDKROOT = iphoneos3.0;
};
name = Distribution;
};
@@ -1553,13 +1749,13 @@
GCC_C_LANGUAGE_STANDARD = c99;
GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
GCC_TREAT_NONCONFORMANT_CODE_ERRORS_AS_WARNINGS = YES;
- GCC_TREAT_WARNINGS_AS_ERRORS = NO;
+ GCC_TREAT_WARNINGS_AS_ERRORS = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- ONLY_ACTIVE_ARCH = NO;
+ ONLY_ACTIVE_ARCH = YES;
PREBINDING = NO;
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "";
- SDKROOT = iphoneos2.0;
+ SDKROOT = iphoneos3.0;
};
name = Debug;
};
@@ -1574,10 +1770,10 @@
GCC_TREAT_WARNINGS_AS_ERRORS = NO;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- ONLY_ACTIVE_ARCH = NO;
+ ONLY_ACTIVE_ARCH = YES;
PREBINDING = NO;
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "";
- SDKROOT = iphoneos2.0;
+ SDKROOT = iphoneos3.0;
};
name = Release;
};
View
12 App.h
@@ -9,7 +9,11 @@
#import <Foundation/Foundation.h>
#import <sqlite3.h>
-@interface App : NSObject {
+#import "ReviewDownloaderOperation.h"
+
+
+
+@interface App : NSObject <ReviewScraperDelegate> {
// fields
NSString *title;
NSString *vendor_identifier;
@@ -26,6 +30,8 @@
// Opaque reference to the underlying database.
sqlite3 *database;
+
+ NSMutableArray *reviews;
// for Downloading Icon image
NSMutableData *receivedData;
@@ -75,10 +81,14 @@
@property (assign, readonly, nonatomic) int totalUnitsSold;
@property (assign, readonly, nonatomic) int totalUnitsFree;
+@property (assign, readonly, nonatomic) NSMutableArray *reviews;
+
- (NSComparisonResult)compareBySales:(App *)otherApp;
- (void) updateTotalsFromDict:(NSDictionary *)totalsDict;
+- (void) getAllReviews;
+
@end
View
123 App.m
@@ -7,10 +7,14 @@
//
#import "App.h"
-#import "ImageManipulator.h"
-#import "ImageResizing.h"
+#import "UIImage+Helpers.h"
#import "ASiSTAppDelegate.h"
#import "YahooFinance.h"
+#import "ReviewDownloaderOperation.h"
+#import "Review.h"
+#import "Database.h"
+#import "Country.h"
+#import "SynchingManager.h"
// Static variables for compiled SQL queries. This implementation choice is to be able to share a one time
@@ -22,15 +26,39 @@
static sqlite3_stmt *init_statement = nil;
static sqlite3_stmt *delete_statement = nil;
static sqlite3_stmt *update_statement = nil;
+static sqlite3_stmt *reviews_statement = nil;
//static sqlite3_stmt *delete_points_statement = nil;
//static sqlite3_stmt *hydrate_statement = nil;
//static sqlite3_stmt *dehydrate_statement = nil;
+// Date formatter for XML files
+static NSDateFormatter *dateFormatterToRead = nil;
+
+
@implementation App
@synthesize iconImage, iconImageNano, isNew, averageRoyaltiesPerDay, apple_identifier, totalRoyalties, totalUnitsSold, totalUnitsFree;
+@synthesize reviews;
+
+- (void) getAllReviews
+{
+
+ NSMutableDictionary *countries = [[Database sharedInstance] countries];
+ NSArray *allKeys = [countries allKeys];
+
+ for (NSString *oneKey in allKeys)
+ {
+ Country *oneCountry = [countries objectForKey:oneKey];
+ if (oneCountry.appStoreID)
+ {
+ [[SynchingManager sharedInstance] scrapeForApp:self country:oneCountry delegate:self];
+ }
+ }
+}
+
+
- (id)init
@@ -42,6 +70,8 @@ - (id)init
UIImage *tmpImageNanoResized = [self.iconImage scaleImageToSize:CGSizeMake(32.0,32.0)];
self.iconImageNano = tmpImageNanoResized;
+ reviews = [[NSMutableArray array] retain];
+
// subscribe to total update notifications
//[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appTotalsUpdated:) name:@"AppTotalsUpdated" object:nil];
// subscribe to cache emptying
@@ -51,6 +81,19 @@ - (id)init
return self;
}
+
+
+- (NSDate *) dateFromString:(NSString *)rfc2822String
+{
+ if (!dateFormatterToRead)
+ {
+ dateFormatterToRead = [[NSDateFormatter alloc] init];
+ [dateFormatterToRead setDateFormat:@"yyyy-MM-dd HH:mm:ss ZZ"]; /* Unicode Locale Data Markup Language */
+ }
+ return [dateFormatterToRead dateFromString:rfc2822String]; /*e.g. @"Thu, 11 Sep 2008 12:34:12 +0200" */
+}
+
+
// Creates the object with primary key and title is brought into memory.
- (id)initWithPrimaryKey:(NSInteger)pk database:(sqlite3 *)db {
if (self = [self init])
@@ -80,6 +123,50 @@ - (id)initWithPrimaryKey:(NSInteger)pk database:(sqlite3 *)db {
// Reset the statement for future reuse.
sqlite3_reset(init_statement);
dirty = NO;
+
+
+ if (reviews_statement == nil) {
+ // Note the '?' at the end of the query. This is a parameter which can be replaced by a bound variable.
+ // This is a great way to optimize because frequently used queries can be compiled once, then with each
+ // use new variable values can be bound to placeholders.
+ const char *sql = "SELECT id, country_code, review_date, version, title, name, review, stars REAL FROM review WHERE app_id=? ORDER BY review_date DESC";
+ if (sqlite3_prepare_v2(database, sql, -1, &reviews_statement, NULL) != SQLITE_OK) {
+ NSAssert1(0, @"Error: failed to prepare statement with message '%s'.", sqlite3_errmsg(database));
+ }
+ }
+ // For this query, we bind the primary key to the first (and only) placeholder in the statement.
+ // Note that the parameters are numbered from 1, not from 0.
+ sqlite3_bind_int(reviews_statement, 1, apple_identifier);
+
+ while (sqlite3_step(reviews_statement) == SQLITE_ROW) {
+ //NSUInteger review_id = sqlite3_column_int(reviews_statement, 0);
+ NSString *country_code = [NSString stringWithUTF8String:(char *)sqlite3_column_text(reviews_statement, 1)];
+ Country *reviewCountry = [DB countryForCode:country_code];
+
+ char *date_text = (char *)sqlite3_column_text(reviews_statement, 2);
+
+ NSDate *review_date;
+
+ if (date_text)
+ {
+ review_date = [self dateFromString:[NSString stringWithUTF8String:(char *)sqlite3_column_text(reviews_statement, 2)]];
+ }
+ NSString *version = [NSString stringWithUTF8String:(char *)sqlite3_column_text(reviews_statement, 3)];
+ NSString *review_title = [NSString stringWithUTF8String:(char *)sqlite3_column_text(reviews_statement, 4)];
+ NSString *review_name = [NSString stringWithUTF8String:(char *)sqlite3_column_text(reviews_statement, 5)];
+ NSString *review_text = [NSString stringWithUTF8String:(char *)sqlite3_column_text(reviews_statement, 6)];
+ double review_stars = sqlite3_column_double(reviews_statement, 7);
+
+ Review *loadedReview = [[Review alloc] initWithApp:self country:reviewCountry title:review_title name:review_name version:version date:review_date review:review_text stars:review_stars];
+
+ [reviews addObject:loadedReview];
+ [loadedReview release];
+ }
+ // Reset the statement for future reuse.
+ sqlite3_reset(reviews_statement);
+
+
+
}
[self loadImageFromBirne];
@@ -192,6 +279,8 @@ - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)err
*/
}
+
+
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
//NSString *URL;
@@ -242,8 +331,14 @@ - (void)connectionDidFinishLoading:(NSURLConnection *)connection
else
{ // JPG
UIImage *tmpImage = [UIImage imageWithData:receivedData];
- UIImage *tmpImageRounded = [ImageManipulator makeRoundCornerImage:tmpImage cornerWidth:20 cornerHeight:20];
- UIImage *tmpImageResized = [tmpImageRounded scaleImageToSize:CGSizeMake(57.0,57.0)];
+
+ // use original iTunes mask
+ UIImage *mask = [UIImage imageNamed:@"cover_mask_rounded_100x100.png"];
+ UIImage *tmpImageRounded = [tmpImage imageByMaskingWithImage:mask];
+
+ //UIImage *tmpImageRounded = [ImageManipulator makeRoundCornerImage:tmpImage cornerWidth:20 cornerHeight:20];
+
+ UIImage *tmpImageResized = [tmpImageRounded scaleImageToSize:CGSizeMake(56.0,56.0)];
self.iconImage = tmpImageResized;
UIImage *tmpImageNanoResized = [tmpImageRounded scaleImageToSize:CGSizeMake(32.0,32.0)];
@@ -285,6 +380,8 @@ - (void)dealloc
[title release];
[vendor_identifier release];
[company_name release];
+
+ [reviews release];
[super dealloc];
}
@@ -450,4 +547,22 @@ - (void)emptyCache:(NSNotification *) notification
iconImageNano = nil;
}
+
+
+#pragma mark ReviewScraper
+
+- (void) didFinishRetrievingReviews:(NSArray *)scrapedReviews;
+{
+ for (Review *oneReview in scrapedReviews)
+ {
+ [oneReview insertIntoDatabase:database];
+ if (oneReview.isNew)
+ {
+ [reviews insertObject:oneReview atIndex:0];
+ }
+ }
+
+ [[NSNotificationCenter defaultCenter] postNotificationName:@"AppReviewsUpdated" object:nil userInfo:(id)self];
+}
+
@end
View
7 Classes/ASiSTAppDelegate.h
@@ -23,7 +23,7 @@
UINavigationController *navigationController;
UITabBarController *tabBarController;
- iTunesConnect *itts;
+ //iTunesConnect *itts;
AppViewController *appViewController;
ReportRootController *reportRootController;
SettingsViewController *settingsViewController;
@@ -43,6 +43,7 @@
IBOutlet UITabBarItem* appBadgeItem;
IBOutlet UITabBarItem* reportBadgeItem;
+ IBOutlet UIBarButtonItem* refreshButton;
}
@@ -51,7 +52,7 @@
@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;
@property (nonatomic, retain) IBOutlet UITabBarItem* appBadgeItem;
@property (nonatomic, retain) IBOutlet UITabBarItem* reportBadgeItem;
-@property (nonatomic, retain) iTunesConnect *itts;
+//@property (nonatomic, retain) iTunesConnect *itts;
@property (nonatomic, readonly, assign) BOOL serverIsRunning;
@property (nonatomic, assign) BOOL convertSalesToMainCurrency;
@@ -66,6 +67,8 @@
@property (nonatomic, retain) IBOutlet SettingsViewController *settingsViewController;
@property (nonatomic, retain) IBOutlet StatusInfoController *statusViewController;
+@property (nonatomic, retain) IBOutlet UIBarButtonItem* refreshButton;
+
//@property (nonatomic, retain) KeychainWrapper *keychainWrapper;
View
97 Classes/ASiSTAppDelegate.m
@@ -32,6 +32,13 @@
#import "AccountManager.h"
#import "Account.h"
+#import "Country.h"
+#import "App.h"
+
+
+//#import "TurboReviewScraper.h"
+#import "SynchingManager.h"
+#import "NSDate+Helpers.h"
@implementation ASiSTAppDelegate
@@ -40,18 +47,41 @@ @implementation ASiSTAppDelegate
@synthesize navigationController;
@synthesize tabBarController;
@synthesize appViewController, reportRootController, settingsViewController, statusViewController;
-@synthesize itts, /*keychainWrapper,*/ serverIsRunning, convertSalesToMainCurrency;
+@synthesize /*itts, keychainWrapper,*/ serverIsRunning, convertSalesToMainCurrency;
@synthesize addresses, httpServer;
-@synthesize appBadgeItem, reportBadgeItem;
+@synthesize appBadgeItem, reportBadgeItem, refreshButton;
+
+
+
+- (void) scrapeReviews
+{
+ NSDate *today = [NSDate date];
+
+ [[NSUserDefaults standardUserDefaults] setObject:today forKey:@"ReviewsLastDownloaded"];
+
+ // get apps sorted
+ NSArray *allApps = [[Database sharedInstance] appsSortedBySales];
+ NSMutableDictionary *countries = [[Database sharedInstance] countries];
+ NSArray *allKeys = [countries allKeys];
+
+ for (App *oneApp in allApps)
+ {
+ for (NSString *oneKey in allKeys)
+ {
+ Country *oneCountry = [countries objectForKey:oneKey];
+ if (oneCountry.appStoreID)
+ {
+ [[SynchingManager sharedInstance] scrapeForApp:oneApp country:oneCountry delegate:oneApp];
+ }
+ }
+ }
+}
- (void)applicationDidFinishLaunching:(UIApplication *)application
{
-/* KeychainWrapper *wrapper= [[KeychainWrapper alloc] init];
- self.keychainWrapper = wrapper;
- [wrapper release];
-*/
+
// Configure and show the window
[window addSubview:[tabBarController view]];
[window addSubview:statusViewController.view];
@@ -124,11 +154,18 @@ - (void)applicationDidFinishLaunching:(UIApplication *)application
if ([acc.accounts count]>0)
{
- itts = [[iTunesConnect alloc] initWithAccount:[acc.accounts objectAtIndex:0]];
+ //itts = [[iTunesConnect alloc] initWithAccount:[acc.accounts objectAtIndex:0]];
+
+ // only auto-sync if we did not already download a daily report today
+ Report *lastDailyReport = [[Database sharedInstance] latestReportOfType:ReportTypeDay];
+ if (![lastDailyReport.downloadedDate sameDateAs:[NSDate date]])
+ {
+ [[SynchingManager sharedInstance] downloadForAccount:[acc.accounts objectAtIndex:0] reportsToIgnore:nil];
+ }
}
else
{
- itts = [[iTunesConnect alloc] init];
+ //itts = [[iTunesConnect alloc] init];
// don't show alert on lock
@@ -154,6 +191,43 @@ - (void)applicationDidFinishLaunching:(UIApplication *)application
}
convertSalesToMainCurrency = [defaults boolForKey:@"AlwaysUseMainCurrency"];
+
+
+ // set default
+ if (![[NSUserDefaults standardUserDefaults] objectForKey:@"ReviewFrequency"])
+ {
+ [[NSUserDefaults standardUserDefaults] setInteger:1 forKey:@"ReviewFrequency"];
+ }
+
+
+
+ // Review Downloading
+
+ if ([[NSUserDefaults standardUserDefaults] boolForKey:@"DownloadReviews"])
+ {
+ NSDate *lastScraped = [[NSUserDefaults standardUserDefaults] objectForKey:@"ReviewsLastDownloaded"];
+ NSInteger scrapeFrequency = [[NSUserDefaults standardUserDefaults] integerForKey:@"ReviewFrequency"];
+
+ if (!lastScraped||!scrapeFrequency)
+ {
+
+ // scrape now
+ [self scrapeReviews];
+ }
+ else
+ {
+ // check interval
+ NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
+ NSDateComponents *comps = [gregorian components:NSDayCalendarUnit fromDate:[lastScraped dateAtBeginningOfDay] toDate:[[NSDate date] dateAtBeginningOfDay] options:0];
+
+ if ([comps day]>scrapeFrequency)
+ {
+ // scrape now
+ [self scrapeReviews];
+
+ }
+ }
+ }
}
@@ -162,7 +236,7 @@ - (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
//[keychainWrapper release];
- [itts release];
+ //[itts release];
[navigationController release];
[window release];
[super dealloc];
@@ -260,8 +334,9 @@ - (void) refreshButton:(id)sender
if ([acc.accounts count]>0)
{
- itts.account = [acc.accounts objectAtIndex:0];
- [itts sync];
+ //itts.account = [acc.accounts objectAtIndex:0];
+ //[itts sync];
+ [[SynchingManager sharedInstance] downloadForAccount:[acc.accounts objectAtIndex:0] reportsToIgnore:[[Database sharedInstance] allReports]];
}
}
View
2 Classes/Account.m
@@ -60,8 +60,6 @@ - (id) initFromKeychainDictionary:(NSDictionary *)dict
[keychainData setObject:(id)kSecClassGenericPassword forKey:(id)kSecClass];
- NSLog(@"keychain after load %@", keychainData);
-
dirty = NO;
}
View
2 Classes/AccountManager.m
@@ -107,7 +107,7 @@ - (void) loadAllGenericAccounts
accounts = [[NSMutableArray alloc] init];
NSMutableDictionary *genericPasswordQuery; // A placeholder for a generic Keychain Item query.
- genericPasswordQuery = [[NSMutableDictionary alloc] init];
+ genericPasswordQuery = [[[NSMutableDictionary alloc] init] autorelease];
[genericPasswordQuery setObject:(id)kSecClassGenericPassword forKey:(id)kSecClass];
NSData *keychainType = [NSData dataWithBytes:kKeychainIdentifier length:strlen((const char *)kKeychainIdentifier)];
[genericPasswordQuery setObject:keychainType forKey:(id)kSecAttrGeneric];
View
22 Classes/AppDetailViewController.h
@@ -0,0 +1,22 @@
+//
+// AppDetailViewController.h
+// ASiST
+//
+// Created by Oliver on 13.09.09.
+// Copyright 2009 Drobnik.com. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+@class App;
+
+@interface AppDetailViewController : UITableViewController
+{
+ App *myApp;
+}
+
+@property (nonatomic, retain) App *myApp;
+
+- (id) initForApp:(App *)app;
+
+@end
View
272 Classes/AppDetailViewController.m
@@ -0,0 +1,272 @@
+//
+// AppDetailViewController.m
+// ASiST
+//
+// Created by Oliver on 13.09.09.
+// Copyright 2009 Drobnik.com. All rights reserved.
+//
+
+#import "AppDetailViewController.h"
+#import "App.h"
+#import "Review.h"
+#import "Country.h"
+#import "ReviewCell.h"
+
+@implementation AppDetailViewController
+
+@synthesize myApp;
+
+- (id) initForApp:(App *)app
+{
+ // Override initWithStyle: if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
+ if (self = [super initWithStyle:UITableViewStylePlain])
+ {
+ self.myApp = app;
+ self.title = app.title;
+
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appReviewsUpdated:) name:@"AppReviewsUpdated" object:nil];
+
+ }
+ return self;
+}
+
+- (void)dealloc
+{
+ [[NSNotificationCenter defaultCenter] removeObserver:self];
+ [myApp release];
+ [super dealloc];
+}
+
+
+/*
+- (void)viewDidLoad {
+ [super viewDidLoad];
+
+ // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
+ // self.navigationItem.rightBarButtonItem = self.editButtonItem;
+}
+*/
+
+/*
+- (void)viewWillAppear:(BOOL)animated {
+ [super viewWillAppear:animated];
+}
+*/
+/*
+- (void)viewDidAppear:(BOOL)animated {
+ [super viewDidAppear:animated];
+}
+*/
+/*
+- (void)viewWillDisappear:(BOOL)animated {
+ [super viewWillDisappear:animated];
+}
+*/
+/*
+- (void)viewDidDisappear:(BOOL)animated {
+ [super viewDidDisappear:animated];
+}
+*/
+
+/*
+// Override to allow orientations other than the default portrait orientation.
+- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
+ // Return YES for supported orientations
+ return (interfaceOrientation == UIInterfaceOrientationPortrait);
+}
+*/
+
+- (void)didReceiveMemoryWarning {
+ // Releases the view if it doesn't have a superview.
+ [super didReceiveMemoryWarning];
+
+ // Release any cached data, images, etc that aren't in use.
+}
+
+- (void)viewDidUnload {
+ // Release any retained subviews of the main view.
+ // e.g. self.myOutlet = nil;
+}
+
+
+#pragma mark Table view methods
+
+- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
+ return 1;
+}
+
+
+// Customize the number of rows in the table view.
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+ return [myApp.reviews count];
+}
+
+
+// Customize the appearance of table view cells.
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+
+ static NSString *CellIdentifier = @"ReviewCell";
+
+ ReviewCell *cell = (ReviewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
+ if (cell == nil) {
+ cell = [[[ReviewCell alloc] initWithReuseIdentifier:CellIdentifier] autorelease];
+ }
+
+ // Set up the cell...
+ Review *rowReview = [myApp.reviews objectAtIndex:indexPath.row];
+
+ cell.reviewText.text = rowReview.review;
+ cell.reviewTitle.text = rowReview.title;
+ cell.reviewAuthor.text = rowReview.name;
+
+ NSDateFormatter *df = [[[NSDateFormatter alloc] init] autorelease];
+ [df setDateStyle:NSDateFormatterShortStyle];
+
+ if (rowReview.isNew)
+ {
+ cell.reviewTitle.textColor = [UIColor redColor];
+ }
+ else
+ {
+ cell.reviewTitle.textColor = [UIColor whiteColor];
+ }
+
+
+
+ NSString *dateString = [df stringFromDate:rowReview.date];
+ cell.reviewDate.text = dateString;
+
+ cell.reviewVersion.text = rowReview.version;
+ cell.countryImage.image = rowReview.country.iconImage;
+
+ int stars = rowReview.stars*5.0;
+
+ switch(stars)
+ {
+ case 5:
+ [cell.ratingImage setImage: [UIImage imageNamed:@"5stars_16.png"]];
+ break;
+
+ case 4:
+ [cell.ratingImage setImage: [UIImage imageNamed:@"4stars_16.png"]];
+ break;
+
+ case 3:
+ [cell.ratingImage setImage: [UIImage imageNamed:@"3stars_16.png"]];
+ break;
+
+ case 2:
+ [cell.ratingImage setImage: [UIImage imageNamed:@"2stars_16.png"]];
+ break;
+
+ case 1:
+ [cell.ratingImage setImage: [UIImage imageNamed:@"1star_16.png"]];
+ break;
+
+ default:
+ break;
+ }
+
+ return cell;
+}
+
+- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
+{
+ Review *review = [myApp.reviews objectAtIndex:indexPath.row];
+
+ UIFont *font = [UIFont systemFontOfSize:12];
+ CGRect contentRect = self.tableView.bounds;
+ CGSize constraint = CGSizeMake(contentRect.size.width - 20, 500);
+
+ NSString *text;
+
+ float height = 16.0f;
+
+ text = review.review;
+
+
+ CGSize size = [text sizeWithFont:font constrainedToSize:constraint];
+
+ height += size.height;
+
+ text = review.name;
+ font = [UIFont boldSystemFontOfSize:12];
+ size = [text sizeWithFont:font constrainedToSize:constraint];
+
+ height += size.height;
+
+ text = review.title;
+ font = [UIFont boldSystemFontOfSize:14];
+ size = [text sizeWithFont:font constrainedToSize:constraint];
+
+ height += size.height;
+
+ return height + 32.0f;
+}
+
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
+ // Navigation logic may go here. Create and push another view controller.
+ // AnotherViewController *anotherViewController = [[AnotherViewController alloc] initWithNibName:@"AnotherView" bundle:nil];
+ // [self.navigationController pushViewController:anotherViewController];
+ // [anotherViewController release];
+}
+
+
+/*
+// Override to support conditional editing of the table view.
+- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
+ // Return NO if you do not want the specified item to be editable.
+ return YES;
+}
+*/
+
+
+/*
+// Override to support editing the table view.
+- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
+
+ if (editingStyle == UITableViewCellEditingStyleDelete) {
+ // Delete the row from the data source
+ [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES];
+ }
+ else if (editingStyle == UITableViewCellEditingStyleInsert) {
+ // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
+ }
+}
+*/
+
+
+/*
+// Override to support rearranging the table view.
+- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
+}
+*/
+
+
+/*
+// Override to support conditional rearranging of the table view.
+- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
+ // Return NO if you do not want the item to be re-orderable.
+ return YES;
+}
+*/
+
+
+#pragma mark Notifications
+- (void)appReviewsUpdated:(NSNotification *) notification
+{
+ if (notification)
+ {
+ App *changedApp = (App *)[notification userInfo];
+
+ if (changedApp == myApp)
+ {
+ [self.tableView reloadData];
+ }
+ }
+
+}
+
+
+@end
+
View
17 Classes/AppViewController.m
@@ -14,6 +14,8 @@
#import "Report.h"
#import "AppCell.h"
+#import "AppDetailViewController.h"
+
@implementation AppViewController
/*
@@ -107,9 +109,11 @@ - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
// The accessory type is the image displayed on the far right of each table cell. In order for the delegate method
// tableView:accessoryButtonClickedForRowWithIndexPath: to be called, you must return the "Detail Disclosure Button" type.
+/*
- (UITableViewCellAccessoryType)tableView:(UITableView *)tableView accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath {
return UITableViewCellAccessoryNone;
}
+*/
// Customize the number of rows in the table view.