rhodes 5.5.2 → 5.5.15

Sign up to get free protection for your applications and to get access to all the features.
Files changed (209) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +1 -1
  3. data/CREDITS +3 -3
  4. data/LICENSE +1 -1
  5. data/README.html +1 -1
  6. data/Rakefile +53 -14
  7. data/bin/get-rhodes-info +0 -0
  8. data/extensions/rhoconnect-push/ext/rhoconnect-push/platform/android/Rakefile +1 -1
  9. data/lib/build/jake.rb +11 -0
  10. data/lib/commonAPI/barcode/ext/platform/iphone/impl/BarcodeFactory.m +2 -1
  11. data/lib/commonAPI/coreapi/ext/NativeTabbar.xml +4 -0
  12. data/lib/commonAPI/coreapi/ext/platform/iphone/cpp_based_impl/SystemImpl.mm +1 -0
  13. data/lib/commonAPI/coreapi/ext/platform/iphone/impl/NativeTabbarSingleton.m +7 -2
  14. data/lib/commonAPI/coreapi/ext/platform/iphone/impl/NativeToolbarSingleton.m +6 -2
  15. data/lib/commonAPI/coreapi/ext/platform/iphone/impl/NavbarSingleton.m +8 -2
  16. data/lib/commonAPI/coreapi/ext/shared/ApplicationImpl.cpp +3 -0
  17. data/lib/commonAPI/coreapi/ext/shared/NetworkImpl.cpp +1 -0
  18. data/lib/commonAPI/coreapi/ext/shared/TimerImpl.cpp +36 -27
  19. data/lib/commonAPI/coreapi/public/api/rhoapi.js +6 -3
  20. data/lib/commonAPI/mediacapture/ext.yml +1 -2
  21. data/lib/commonAPI/mediacapture/ext/build.bat +8 -0
  22. data/lib/commonAPI/mediacapture/ext/platform/qt/MediaCapture.pro +82 -0
  23. data/lib/commonAPI/mediacapture/ext/platform/qt/Rakefile +35 -0
  24. data/lib/commonAPI/mediacapture/ext/platform/qt/resources/diaClosed.png +0 -0
  25. data/lib/commonAPI/mediacapture/ext/platform/qt/resources/diaOpened.png +0 -0
  26. data/lib/commonAPI/mediacapture/ext/platform/qt/resources/mediacapture.qrc +7 -0
  27. data/lib/commonAPI/mediacapture/ext/platform/qt/resources/photoSave.png +0 -0
  28. data/lib/commonAPI/mediacapture/ext/platform/qt/src/CCameraData.cpp +83 -0
  29. data/lib/commonAPI/mediacapture/ext/platform/qt/src/CCameraData.h +54 -0
  30. data/lib/commonAPI/mediacapture/ext/platform/qt/src/CameraDialogBuilder.h +36 -0
  31. data/lib/commonAPI/mediacapture/ext/platform/qt/src/CameraDialogController.h +31 -0
  32. data/lib/commonAPI/mediacapture/ext/platform/qt/src/CameraDialogView.h +73 -0
  33. data/lib/commonAPI/mediacapture/ext/platform/qt/src/Camera_impl.cpp +337 -0
  34. data/lib/commonAPI/mediacapture/ext/platform/qt/src/ImageFileNameGetter.h +40 -0
  35. data/lib/commonAPI/mediacapture/ext/platform/qt/src/ImageFilenameGetterResult.h +36 -0
  36. data/lib/commonAPI/mediacapture/ext/platform/qt/src/cameracrossthreadhalper.h +17 -0
  37. data/lib/commonAPI/mediacapture/ext/platform/qt/src/cameradialogview.cpp +178 -0
  38. data/lib/commonAPI/mediacapture/ext/shared/MediacaptureInit.cpp +8 -8
  39. data/lib/framework/rhodes.rb +1 -1
  40. data/lib/framework/version.rb +1 -1
  41. data/platform/android/Rhodes/AndroidManifest.xml.erb +1 -1
  42. data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhodesService.java +9 -2
  43. data/platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/SplashScreen.java +33 -0
  44. data/platform/android/build/android.rake +97 -43
  45. data/platform/android/build/android_studio_project_generator.rb +21 -0
  46. data/platform/android/build/android_tools.rb +8 -6
  47. data/platform/iphone/Classes/AppManager/AppManager.h +6 -0
  48. data/platform/iphone/Classes/AppManager/AppManager.m +76 -37
  49. data/platform/iphone/Classes/MapView/GoogleGeocoder.m +2 -3
  50. data/platform/iphone/Classes/MapView/MapViewController.m +3 -3
  51. data/platform/iphone/Classes/NativeBar.h +1 -0
  52. data/platform/iphone/Classes/NativeBar.m +15 -0
  53. data/platform/iphone/Classes/RhoViewController.m +8 -3
  54. data/platform/iphone/Classes/RhoWKWebView.m +1 -1
  55. data/platform/iphone/Classes/Rhodes.m +55 -38
  56. data/platform/iphone/Classes/SimpleMainView.m +3 -2
  57. data/platform/iphone/Classes/TabbedMainView.h +2 -0
  58. data/platform/iphone/Classes/TabbedMainView.m +15 -3
  59. data/platform/iphone/Classes/URLProtocol/CRhoURLProtocol.h +2 -0
  60. data/platform/iphone/Classes/URLProtocol/CRhoURLProtocol.m +185 -30
  61. data/platform/iphone/Classes/rho/net/IPhoneNetRequest.mm +105 -6
  62. data/platform/iphone/rbuild/iphone.rake +426 -267
  63. data/platform/iphone/rbuild/putsOverride.rake +8 -0
  64. data/platform/shared/api_generator/iphone/CJSConverter.mm +5 -3
  65. data/platform/shared/common/BundleManager.cpp +16 -6
  66. data/platform/shared/common/PosixThreadImpl.cpp +10 -4
  67. data/platform/shared/common/RhoTime.cpp +81 -40
  68. data/platform/shared/common/RhodesApp.cpp +2 -2
  69. data/platform/shared/common/RhodesApp.h +1 -1
  70. data/platform/shared/db/DBAdapter.cpp +33 -0
  71. data/platform/shared/db/DBAdapter.h +5 -0
  72. data/platform/shared/logging/RhoLogConf.cpp +17 -1
  73. data/platform/shared/logging/RhoLogConf.h +6 -0
  74. data/platform/shared/net/CURLNetRequest.cpp +6 -0
  75. data/platform/shared/net/HttpServer.cpp +27 -1
  76. data/platform/shared/net/INetRequest.cpp +33 -6
  77. data/platform/shared/net/INetRequest.h +2 -0
  78. data/platform/shared/qt/RhoSimulator_dev.pro +14 -10
  79. data/platform/shared/qt/rhodes/QtMainWindow.cpp +2 -2
  80. data/platform/shared/qt/rhodes/iexecutable.h +27 -0
  81. data/platform/shared/qt/rhodes/impl/MainWindowImpl.cpp +5 -0
  82. data/platform/shared/qt/rhodes/impl/MainWindowImpl.h +3 -0
  83. data/platform/shared/qt/rhodes/qkineticscroller.cpp +2 -2
  84. data/platform/shared/qt/rhodes/qkineticscroller_p.h +1 -1
  85. data/platform/shared/qt/rhodes/qtscrollerfilter.cpp +3 -3
  86. data/platform/shared/qt/rhodes/qtscrollevent.cpp +2 -2
  87. data/platform/shared/qt/rhodes/qwebviewkineticscroller.cpp +1 -1
  88. data/platform/shared/qt/rhodes/qwebviewkineticscroller.h +1 -1
  89. data/platform/shared/qt/rhodes/resources/rho.png +0 -0
  90. data/platform/shared/qt/rhodes/rhodes.pro +3 -2
  91. data/platform/wm/build/wm.rake +28 -9
  92. data/platform/wm/rhodes/browser/BrowserFactory.cpp +4 -6
  93. data/platform/wm/rhodes/browser/stubs.cpp +5 -0
  94. data/platform/wm/rhodes/rho/net/NetRequestImpl.h +3 -0
  95. data/platform/wm/rhodes/rhodes.vcproj +31 -2
  96. data/rakefile.rb +53 -14
  97. data/res/build-tools/iphonesim/build/Release/iphonesim_8 +2 -2
  98. data/res/generators/rhogen.rb +6 -147
  99. data/res/generators/templates/api/platform/iphone/generated/base_impl/MontanaBase.m +7 -7
  100. data/res/generators/templates/api/platform/iphone/generated/javascript/montana_js_wrap.mm +2 -4
  101. data/res/generators/templates/application/AndroidManifest.erb +1 -1
  102. data/res/generators/templates/application/app/Settings/home.erb +1 -1
  103. data/res/generators/templates/application/build.yml +52 -6
  104. data/res/generators/templates/application/icon/icon.png +0 -0
  105. data/res/generators/templates/application/resources/android/res/drawable-hdpi/ic_notification.png +0 -0
  106. data/res/generators/templates/application/resources/android/res/drawable-hdpi/icon.png +0 -0
  107. data/res/generators/templates/application/resources/android/res/drawable-hdpi/loading.png +0 -0
  108. data/res/generators/templates/application/resources/android/res/drawable-ldpi/ic_notification.png +0 -0
  109. data/res/generators/templates/application/resources/android/res/drawable-ldpi/icon.png +0 -0
  110. data/res/generators/templates/application/resources/android/res/drawable-ldpi/loading.png +0 -0
  111. data/res/generators/templates/application/resources/android/res/drawable-mdpi/ic_notification.png +0 -0
  112. data/res/generators/templates/application/resources/android/res/drawable-mdpi/icon.png +0 -0
  113. data/res/generators/templates/application/resources/android/res/drawable-mdpi/loading.png +0 -0
  114. data/res/generators/templates/application/resources/android/res/drawable-xhdpi/ic_notification.png +0 -0
  115. data/res/generators/templates/application/resources/android/res/drawable-xhdpi/icon.png +0 -0
  116. data/res/generators/templates/application/resources/android/res/drawable-xhdpi/loading.png +0 -0
  117. data/res/generators/templates/application/resources/android/res/drawable-xxhdpi/ic_notification.png +0 -0
  118. data/res/generators/templates/application/resources/android/res/drawable-xxhdpi/icon.png +0 -0
  119. data/res/generators/templates/application/resources/android/res/drawable-xxhdpi/loading.png +0 -0
  120. data/res/generators/templates/application/resources/android/res/drawable-xxxhdpi/ic_notification.png +0 -0
  121. data/res/generators/templates/application/resources/android/res/drawable-xxxhdpi/icon.png +0 -0
  122. data/res/generators/templates/application/resources/android/res/drawable-xxxhdpi/loading.png +0 -0
  123. data/res/generators/templates/application/resources/android/res/drawable/ic_notification.png +0 -0
  124. data/res/generators/templates/application/resources/android/res/drawable/icon.png +0 -0
  125. data/res/generators/templates/application/resources/android/res/drawable/loading.png +0 -0
  126. data/res/generators/templates/application/resources/android/res/mipmap-hdpi/icon.png +0 -0
  127. data/res/generators/templates/application/resources/android/res/mipmap-ldpi/icon.png +0 -0
  128. data/res/generators/templates/application/resources/android/res/mipmap-mdpi/icon.png +0 -0
  129. data/res/generators/templates/application/resources/android/res/mipmap-xhdpi/icon.png +0 -0
  130. data/res/generators/templates/application/resources/android/res/mipmap-xxhdpi/icon.png +0 -0
  131. data/res/generators/templates/application/resources/android/res/mipmap-xxxhdpi/icon.png +0 -0
  132. data/res/generators/templates/application/resources/android/res/mipmap/icon.png +0 -0
  133. data/res/generators/templates/application/{app/loading-568h@2x.png → resources/ios/Default-568h@2x.png} +0 -0
  134. data/res/generators/templates/application/{app/loading-667h@2x.png → resources/ios/Default-667h@2x.png} +0 -0
  135. data/res/generators/templates/application/{app/loading-736h@3x.png → resources/ios/Default-736h@3x.png} +0 -0
  136. data/res/generators/templates/application/{app/loading-Landscape.png → resources/ios/Default-Landscape.png} +0 -0
  137. data/res/generators/templates/application/{app/loading-Landscape@2x.png → resources/ios/Default-Landscape@2x.png} +0 -0
  138. data/res/generators/templates/application/{app/loading-LandscapeLeft.png → resources/ios/Default-LandscapeLeft.png} +0 -0
  139. data/res/generators/templates/application/{app/loading-LandscapeLeft@2x.png → resources/ios/Default-LandscapeLeft@2x.png} +0 -0
  140. data/res/generators/templates/application/{app/loading-LandscapeRight.png → resources/ios/Default-LandscapeRight.png} +0 -0
  141. data/res/generators/templates/application/{app/loading-LandscapeRight@2x.png → resources/ios/Default-LandscapeRight@2x.png} +0 -0
  142. data/res/generators/templates/application/{app/loading-Portrait.png → resources/ios/Default-Portrait.png} +0 -0
  143. data/res/generators/templates/application/{app/loading-Portrait@2x.png → resources/ios/Default-Portrait@2x.png} +0 -0
  144. data/res/generators/templates/application/{app/loading-PortraitUpsideDown.png → resources/ios/Default-PortraitUpsideDown.png} +0 -0
  145. data/res/generators/templates/application/{app/loading-PortraitUpsideDown@2x.png → resources/ios/Default-PortraitUpsideDown@2x.png} +0 -0
  146. data/res/generators/templates/application/resources/ios/Default.png +0 -0
  147. data/res/generators/templates/application/{app/loading@2x.png → resources/ios/Default@2x.png} +0 -0
  148. data/res/generators/templates/application/resources/ios/iTunesArtwork.png +0 -0
  149. data/res/generators/templates/application/resources/ios/iTunesArtwork@2x.png +0 -0
  150. data/res/generators/templates/application/resources/ios/icon114.png +0 -0
  151. data/res/generators/templates/application/resources/ios/icon120.png +0 -0
  152. data/res/generators/templates/application/resources/ios/icon144.png +0 -0
  153. data/res/generators/templates/application/resources/ios/icon152.png +0 -0
  154. data/res/generators/templates/application/resources/ios/icon180.png +0 -0
  155. data/res/generators/templates/application/resources/ios/icon57.png +0 -0
  156. data/res/generators/templates/application/resources/ios/icon60.png +0 -0
  157. data/res/generators/templates/application/resources/ios/icon72.png +0 -0
  158. data/res/generators/templates/application/resources/ios/icon76.png +0 -0
  159. data/res/generators/templates/application/rhoconfig.txt +2 -1
  160. data/res/generators/templates/iphone_project/Bremen7.xcodeproj/project.pbxproj +44 -0
  161. data/res/generators/templates/iphone_project/Resources/back_btn.png +0 -0
  162. data/res/generators/templates/iphone_project/Resources/back_btn@2x.png +0 -0
  163. data/res/generators/templates/iphone_project/Resources/back_btn@3x.png +0 -0
  164. data/res/generators/templates/iphone_project/Resources/forward_btn.png +0 -0
  165. data/res/generators/templates/iphone_project/Resources/forward_btn@2x.png +0 -0
  166. data/res/generators/templates/iphone_project/Resources/forward_btn@3x.png +0 -0
  167. data/res/generators/templates/iphone_project/Resources/gears.png +0 -0
  168. data/res/generators/templates/iphone_project/Resources/gears@2x.png +0 -0
  169. data/res/generators/templates/iphone_project/Resources/gears@3x.png +0 -0
  170. data/res/generators/templates/iphone_project/Resources/home_btn.png +0 -0
  171. data/res/generators/templates/iphone_project/Resources/home_btn@2x.png +0 -0
  172. data/res/generators/templates/iphone_project/Resources/home_btn@3x.png +0 -0
  173. data/res/generators/templates/iphone_project/Resources/sync_btn.png +0 -0
  174. data/res/generators/templates/iphone_project/Resources/sync_btn@2x.png +0 -0
  175. data/res/generators/templates/iphone_project/Resources/sync_btn@3x.png +0 -0
  176. data/res/generators/templates/iphone_project/buildRhoBundle +23 -7
  177. data/res/generators/templates/iphone_project/root/Info.plist +0 -7
  178. data/res/generators/templates/iphone_project/root/iTunesArtwork +0 -0
  179. data/res/generators/templates/iphone_project/root/iTunesArtwork@2x +0 -0
  180. data/res/generators/templates/iphone_project/root/icon114.png +0 -0
  181. data/res/generators/templates/iphone_project/root/icon120.png +0 -0
  182. data/res/generators/templates/iphone_project/root/icon144.png +0 -0
  183. data/res/generators/templates/iphone_project/root/icon152.png +0 -0
  184. data/res/generators/templates/iphone_project/root/icon180.png +0 -0
  185. data/res/generators/templates/iphone_project/root/icon57.png +0 -0
  186. data/res/generators/templates/iphone_project/root/icon60.png +0 -0
  187. data/res/generators/templates/iphone_project/root/icon72.png +0 -0
  188. data/res/generators/templates/iphone_project/root/icon76.png +0 -0
  189. data/res/generators/templates/project/android_studio_project/app/build.gradle.erb +88 -0
  190. data/res/generators/templates/project/android_studio_project/build.gradle +23 -0
  191. data/res/generators/templates/project/android_studio_project/gradle.properties +17 -0
  192. data/res/generators/templates/project/android_studio_project/gradlew +160 -0
  193. data/res/generators/templates/project/android_studio_project/gradlew.bat +90 -0
  194. data/res/generators/templates/project/android_studio_project/settings.gradle +1 -0
  195. data/rhodes.gemspec +7 -6
  196. data/version +1 -1
  197. metadata +135 -42
  198. data/res/generators/templates/application/icon/icon.svg +0 -22
  199. data/res/generators/templates/application/icon/icon114.png +0 -0
  200. data/res/generators/templates/application/icon/icon120.png +0 -0
  201. data/res/generators/templates/application/icon/icon144.png +0 -0
  202. data/res/generators/templates/application/icon/icon152.png +0 -0
  203. data/res/generators/templates/application/icon/icon180.png +0 -0
  204. data/res/generators/templates/application/icon/icon57.png +0 -0
  205. data/res/generators/templates/application/icon/icon60.png +0 -0
  206. data/res/generators/templates/application/icon/icon72.png +0 -0
  207. data/res/generators/templates/application/icon/icon76.png +0 -0
  208. data/res/generators/templates/application/production/iTunesArtwork.png +0 -0
  209. data/res/generators/templates/application/production/iTunesArtwork@2x.png +0 -0
@@ -0,0 +1,337 @@
1
+ //
2
+ // CameraImpl.cpp
3
+ #include <Qt>
4
+ #include <QHash>
5
+ #include <QApplication>
6
+ #include <QWindow>
7
+ #include "CCameraData.h"
8
+ #include "common/RhoStd.h"
9
+ #include "common/AutoPointer.h"
10
+ #include "common/RhodesApp.h"
11
+ #include "common/RhoConf.h"
12
+ #include "generated/cpp/CameraBase.h"
13
+ #include "logging/RhoLog.h"
14
+
15
+ namespace rho {
16
+
17
+ using namespace apiGenerator;
18
+ using namespace common;
19
+
20
+ class CCameraSingletonImpl: public CCameraSingletonBase
21
+ {
22
+ QHash<QString, QString> defaultCameras;
23
+
24
+ public:
25
+
26
+ CCameraSingletonImpl(): CCameraSingletonBase()
27
+ {
28
+ qRegisterMetaType<rho::apiGenerator::CMethodResult>("rho::apiGenerator::CMethodResult");
29
+ }
30
+
31
+ virtual ~CCameraSingletonImpl(){
32
+ QMutexLocker locker(CCameraData::getMutex());
33
+ CCameraData::cleanAll();
34
+ }
35
+
36
+ //methods
37
+ // enumerate Returns the cameras present on your device, allowing you to access your device's front or back camera.
38
+ virtual void enumerate(rho::apiGenerator::CMethodResult& oResult) {
39
+ initCameras();
40
+ rho::Vector<rho::String> arIDs = oResult.getStringArray();
41
+ if(!CCameraData::isEmpty()){
42
+ foreach (QString value, CCameraData::getKeys()) {
43
+ arIDs.addElement(value.toStdString());
44
+ }
45
+ oResult.set(arIDs);
46
+ }
47
+
48
+ }
49
+
50
+ void initCameras(){
51
+ QMutexLocker locker(CCameraData::getMutex());
52
+ if(CCameraData::isEmpty()){
53
+ foreach (QCameraInfo cameraInfo, QCameraInfo::availableCameras()) {
54
+ const CCameraData * data = CCameraData::addNewCamera(cameraInfo);
55
+ defaultCameras.insert(data->getCameraType(), data->getCameraID());
56
+ }
57
+ }
58
+ }
59
+
60
+ // getCameraByType Returns the camera of requested type if that camera exist - else return nil.
61
+ virtual void getCameraByType( const rho::String& cameraType, rho::apiGenerator::CMethodResult& oResult) {
62
+ oResult.set(defaultCameras.value(QString::fromStdString(cameraType)).toStdString());
63
+ }
64
+ // choosePicture Choose a picture from the album.
65
+
66
+ static void getImageData(rho::Hashtable<String,String> & mapRes, QString fileNameToOpen){
67
+ CameraDialogView::getImageData(mapRes, fileNameToOpen);
68
+ }
69
+
70
+ virtual void choosePicture( const rho::Hashtable<rho::String, rho::String>& propertyMap, rho::apiGenerator::CMethodResult& oResult) {
71
+ // RAWLOGC_INFO("choosePicture","Camera");
72
+ CCameraData::choosePicture(oResult);
73
+ }
74
+ // copyImageToDeviceGallery Save an image to the device gallery.
75
+ virtual void copyImageToDeviceGallery( const rho::String& pathToImage, rho::apiGenerator::CMethodResult& oResult) {
76
+ // RAWLOGC_INFO("copyImageToDeviceGallery","Camera");
77
+ QString originalFileName(QString::fromStdString(pathToImage));
78
+ QFileInfo info(originalFileName);
79
+ QString newFileName(CameraDialogView::getImageDir().absolutePath() + "/" + info.fileName());
80
+ QFile::copy(originalFileName, newFileName);
81
+ oResult.set(newFileName.toStdString());
82
+ }
83
+
84
+ virtual rho::String getInitialDefaultID(){
85
+ initCameras();
86
+ QString defaultId = defaultCameras.value("front");
87
+ if (!defaultId.isEmpty()) return defaultId.toStdString();
88
+ else return defaultCameras.value("back").toStdString();
89
+ }
90
+
91
+ };
92
+
93
+ class CCameraImpl : public CCameraBase
94
+ {
95
+ CCameraImpl(){}
96
+ CCameraData * camera;
97
+ public:
98
+ virtual ~CCameraImpl() {}
99
+
100
+ //methods
101
+
102
+ CCameraImpl(const rho::String& strID){
103
+ camera = CCameraData::getCameraData(QString::fromStdString(strID));
104
+ }
105
+
106
+ virtual void getCameraType(rho::apiGenerator::CMethodResult& oResult) {
107
+ if (camera != nullptr){oResult.set(camera->getCameraType().toStdString());}
108
+ }
109
+
110
+ virtual void getMaxWidth(rho::apiGenerator::CMethodResult& oResult) {
111
+
112
+ }
113
+
114
+ virtual void getMaxHeight(rho::apiGenerator::CMethodResult& oResult) {
115
+
116
+ }
117
+
118
+ virtual void getSupportedSizeList(rho::apiGenerator::CMethodResult& oResult) {
119
+
120
+ }
121
+
122
+ virtual void getDesiredWidth(rho::apiGenerator::CMethodResult& oResult) {
123
+
124
+ }
125
+
126
+ virtual void setDesiredWidth( int desiredWidth, rho::apiGenerator::CMethodResult& oResult) {
127
+
128
+ }
129
+
130
+ virtual void getDesiredHeight(rho::apiGenerator::CMethodResult& oResult) {
131
+
132
+ }
133
+
134
+ virtual void setDesiredHeight( int desiredHeight, rho::apiGenerator::CMethodResult& oResult) {
135
+
136
+ }
137
+
138
+ virtual void getFileName(rho::apiGenerator::CMethodResult& oResult) {
139
+
140
+ }
141
+
142
+ virtual void setFileName( const rho::String& fileName, rho::apiGenerator::CMethodResult& oResult) {
143
+
144
+ }
145
+
146
+ virtual void getCompressionFormat(rho::apiGenerator::CMethodResult& oResult) {
147
+
148
+ }
149
+
150
+ virtual void setCompressionFormat( const rho::String& compressionFormat, rho::apiGenerator::CMethodResult& oResult) {
151
+
152
+ }
153
+
154
+ virtual void getOutputFormat(rho::apiGenerator::CMethodResult& oResult) {
155
+
156
+ }
157
+
158
+ virtual void setOutputFormat( const rho::String& outputFormat, rho::apiGenerator::CMethodResult& oResult) {
159
+
160
+ }
161
+
162
+ virtual void getColorModel(rho::apiGenerator::CMethodResult& oResult) {
163
+
164
+ }
165
+
166
+ virtual void setColorModel( const rho::String& colorModel, rho::apiGenerator::CMethodResult& oResult) {
167
+
168
+ }
169
+
170
+ virtual void getEnableEditing(rho::apiGenerator::CMethodResult& oResult) {
171
+
172
+ }
173
+
174
+ virtual void setEnableEditing( bool enableEditing, rho::apiGenerator::CMethodResult& oResult) {
175
+
176
+ }
177
+
178
+ virtual void getFlashMode(rho::apiGenerator::CMethodResult& oResult) {
179
+
180
+ }
181
+
182
+ virtual void setFlashMode( const rho::String& flashMode, rho::apiGenerator::CMethodResult& oResult) {
183
+
184
+ }
185
+
186
+ virtual void getSaveToDeviceGallery(rho::apiGenerator::CMethodResult& oResult) {
187
+
188
+ }
189
+
190
+ virtual void setSaveToDeviceGallery( bool saveToDeviceGallery, rho::apiGenerator::CMethodResult& oResult) {
191
+
192
+ }
193
+
194
+ virtual void getCaptureSound(rho::apiGenerator::CMethodResult& oResult) {
195
+
196
+ }
197
+
198
+ virtual void setCaptureSound( const rho::String& captureSound, rho::apiGenerator::CMethodResult& oResult) {
199
+
200
+ }
201
+
202
+ virtual void getPreviewLeft(rho::apiGenerator::CMethodResult& oResult) {
203
+
204
+ }
205
+
206
+ virtual void setPreviewLeft( int previewLeft, rho::apiGenerator::CMethodResult& oResult) {
207
+
208
+ }
209
+
210
+ virtual void getPreviewTop(rho::apiGenerator::CMethodResult& oResult) {
211
+
212
+ }
213
+
214
+ virtual void setPreviewTop( int previewTop, rho::apiGenerator::CMethodResult& oResult) {
215
+
216
+ }
217
+
218
+ virtual void getPreviewWidth(rho::apiGenerator::CMethodResult& oResult) {
219
+
220
+ }
221
+
222
+ virtual void setPreviewWidth( int previewWidth, rho::apiGenerator::CMethodResult& oResult) {
223
+
224
+ }
225
+
226
+ virtual void getPreviewHeight(rho::apiGenerator::CMethodResult& oResult) {
227
+
228
+ }
229
+
230
+ virtual void setPreviewHeight( int previewHeight, rho::apiGenerator::CMethodResult& oResult) {
231
+
232
+ }
233
+
234
+ virtual void getUseSystemViewfinder(rho::apiGenerator::CMethodResult& oResult) {
235
+
236
+ }
237
+
238
+ virtual void setUseSystemViewfinder( bool useSystemViewfinder, rho::apiGenerator::CMethodResult& oResult) {
239
+
240
+ }
241
+
242
+ virtual void getUseRealBitmapResize(rho::apiGenerator::CMethodResult& oResult) {
243
+
244
+ }
245
+
246
+ virtual void setUseRealBitmapResize( bool useRealBitmapResize, rho::apiGenerator::CMethodResult& oResult) {
247
+
248
+ }
249
+
250
+ virtual void getUseRotationBitmapByEXIF(rho::apiGenerator::CMethodResult& oResult) {
251
+
252
+ }
253
+
254
+ virtual void setUseRotationBitmapByEXIF( bool useRotationBitmapByEXIF, rho::apiGenerator::CMethodResult& oResult) {
255
+
256
+ }
257
+
258
+ virtual void getAimMode(rho::apiGenerator::CMethodResult& oResult) {
259
+
260
+ }
261
+
262
+ virtual void setAimMode( const rho::String& aimMode, rho::apiGenerator::CMethodResult& oResult) {
263
+
264
+ }
265
+
266
+ virtual void takePicture( const rho::Hashtable<rho::String, rho::String>& propertyMap, rho::apiGenerator::CMethodResult& oResult) {
267
+ capture(oResult);
268
+ }
269
+
270
+ virtual void showPreview( const rho::Hashtable<rho::String, rho::String>& propertyMap, rho::apiGenerator::CMethodResult& oResult) {
271
+
272
+ }
273
+
274
+ virtual void hidePreview(rho::apiGenerator::CMethodResult& oResult) {
275
+
276
+ }
277
+
278
+ virtual void capture(rho::apiGenerator::CMethodResult& oResult) {
279
+ if (camera == nullptr) {
280
+ rho::Hashtable<rho::String, rho::String>& mapRes = oResult.getStringHash();
281
+ mapRes["status"] = "error";
282
+ mapRes["message"] = "Camera is not available";
283
+ oResult.set(mapRes);
284
+ return;
285
+ }
286
+ camera->showView(oResult);
287
+ }
288
+
289
+ virtual void getProperty( const rho::String& propertyName, rho::apiGenerator::CMethodResult& oResult) {
290
+
291
+ }
292
+
293
+ virtual void getProperties( const rho::Vector<rho::String>& arrayofNames, rho::apiGenerator::CMethodResult& oResult) {
294
+
295
+ }
296
+
297
+ virtual void getAllProperties(rho::apiGenerator::CMethodResult& oResult) {
298
+
299
+ }
300
+
301
+ virtual void setProperty( const rho::String& propertyName, const rho::String& propertyValue, rho::apiGenerator::CMethodResult& oResult) {
302
+
303
+ }
304
+
305
+ virtual void setProperties( const rho::Hashtable<rho::String, rho::String>& propertyMap, rho::apiGenerator::CMethodResult& oResult) {
306
+
307
+ }
308
+
309
+ };
310
+
311
+ ////////////////////////////////////////////////////////////////////////
312
+
313
+ class CCameraFactory: public CCameraFactoryBase {
314
+ public:
315
+ CCameraFactory(){}
316
+
317
+ ICameraSingleton* createModuleSingleton()
318
+ {
319
+ static CCameraSingletonImpl * impl = new CCameraSingletonImpl();
320
+ return impl;
321
+ }
322
+
323
+ virtual ICamera* createModuleByID(const rho::String& strID){
324
+ createModuleSingleton();
325
+ return new CCameraImpl(strID);
326
+ }
327
+
328
+ };
329
+
330
+ }
331
+
332
+ extern "C" void Init_Camera_extension()
333
+ {
334
+ rho::CCameraFactory::setInstance( new rho::CCameraFactory() );
335
+ rho::Init_Camera_API();
336
+
337
+ }
@@ -0,0 +1,40 @@
1
+ #ifndef IMAGEFILENAMEGETTER_H
2
+ #define IMAGEFILENAMEGETTER_H
3
+
4
+ #include <QString>
5
+ #include <QList>
6
+ #include <QFileDialog>
7
+ #include <QStandardPaths>
8
+ #include <QImage>
9
+ #include <QTimer>
10
+ #include "ImageFilenameGetterResult.h"
11
+ #include "CameraDialogView.h"
12
+
13
+ class ImageFileNameGetter : public IExecutable
14
+ {
15
+ Q_OBJECT
16
+ public:
17
+ explicit ImageFileNameGetter(QThread * owner, rho::apiGenerator::CMethodResult &oResult, QObject * parent):IExecutable(parent){
18
+ threadOwner = owner;
19
+ result = oResult;
20
+ }
21
+ private:
22
+ QThread * threadOwner;
23
+ rho::apiGenerator::CMethodResult result;
24
+
25
+ signals:
26
+
27
+ public slots:
28
+ void execute(){
29
+ QString fileNameToOpen = QFileDialog::getOpenFileName(0, "Open Image",
30
+ //QStandardPaths::standardLocations(QStandardPaths::PicturesLocation).last()
31
+ CameraDialogView::getImageDir().absolutePath()
32
+ , "Image Files (*.JPG *.PNG *.BMP *.GIF)");
33
+ ImageFileNameGetterResult * getterResult = new ImageFileNameGetterResult(result, fileNameToOpen, threadOwner);
34
+ getterResult->execute();
35
+ deleteLater();
36
+ }
37
+
38
+ };
39
+
40
+ #endif // IMAGEFILENAMEGETTER_H
@@ -0,0 +1,36 @@
1
+ #ifndef IMAGEFILENAMEGETTERRESULT_H
2
+ #define IMAGEFILENAMEGETTERRESULT_H
3
+
4
+ #include "../../platform/shared/qt/rhodes/iexecutable.h"
5
+ #include "CameraDialogView.h"
6
+ #include <QDebug>
7
+
8
+ class ImageFileNameGetterResult : public IExecutable
9
+ {
10
+ Q_OBJECT
11
+ public:
12
+ explicit ImageFileNameGetterResult(rho::apiGenerator::CMethodResult &oResult, QString &fileName, QObject * parent):IExecutable(parent){
13
+ result = oResult;
14
+ this->fileName = fileName;
15
+
16
+ }
17
+ private:
18
+ rho::apiGenerator::CMethodResult result;
19
+ QString fileName;
20
+
21
+ public slots:
22
+ void execute(){
23
+ rho::Hashtable<rho::String,rho::String>& mapRes = result.getStringHash();
24
+ if (!fileName.isEmpty()){
25
+ CameraDialogView::getImageData(mapRes, fileName);
26
+ }else{
27
+ mapRes["status"] = "cancel";
28
+ mapRes["message"] = "Open file dialog has been canceled";
29
+ }
30
+
31
+ result.set(mapRes);
32
+ deleteLater();
33
+ }
34
+ };
35
+
36
+ #endif // IMAGEFILENAMEGETTERRESULT_H
@@ -0,0 +1,17 @@
1
+ #ifndef CAMERACROSSTHREADHALPER_H
2
+ #define CAMERACROSSTHREADHALPER_H
3
+
4
+ #include <QObject>
5
+
6
+ class CameraCrossThreadHalper : public QObject
7
+ {
8
+ Q_OBJECT
9
+ public:
10
+ explicit CameraCrossThreadHalper(QObject *parent = 0);
11
+
12
+ signals:
13
+
14
+ public slots:
15
+ };
16
+
17
+ #endif // CAMERACROSSTHREADHALPER_H
@@ -0,0 +1,178 @@
1
+ #include "CameraDialogView.h"
2
+
3
+
4
+ CameraDialogView::CameraDialogView(QCameraInfo &info, rho::apiGenerator::CMethodResult &oResult,
5
+ CameraDialogController *controller, QWidget *parent) : QDialog(parent){
6
+ camera = new QCamera(info, this);
7
+ this->oResult = oResult;
8
+ this->controller = controller;
9
+ imageIsSaved = false;
10
+
11
+ imageCapture = new QCameraImageCapture(camera, this);
12
+ imageCapture->setBufferFormat(QVideoFrame::Format_RGB32);
13
+
14
+ imageCapture->setCaptureDestination(QCameraImageCapture::CaptureToBuffer);
15
+ QImageEncoderSettings settings = imageCapture->encodingSettings();
16
+ settings.setQuality(QMultimedia::EncodingQuality::VeryHighQuality);
17
+ imageCapture->setEncodingSettings(settings);
18
+
19
+ connect(imageCapture, SIGNAL(imageSaved(int, const QString)), this, SLOT(imageSaved(int,const QString)));
20
+
21
+ QHBoxLayout * hblay = new QHBoxLayout(this);
22
+
23
+ QVBoxLayout * vblay = new QVBoxLayout();
24
+ videoWidget = new QVideoWidget(this);
25
+ vblay->addWidget(videoWidget,0,Qt::AlignCenter);
26
+ videoWidget->setFixedWidth(300);
27
+ Q_INIT_RESOURCE(mediacapture);
28
+
29
+ imageCaptureClose = QIcon(":/mcimages/diaClosed.png");
30
+
31
+ imageCaptureOpened = QIcon(":/mcimages/diaOpened.png");
32
+ imageSave = QIcon(":/mcimages/photoSave.png");
33
+
34
+ connect(&timerToRestoreCaptureButtonImage, SIGNAL(timeout()), this, SLOT(restoreCaptureButtonImage()));
35
+ timerToRestoreCaptureButtonImage.setSingleShot(true);
36
+
37
+ buttonCapture = new QPushButton(imageCaptureOpened, "", this);
38
+ buttonCapture->setFixedSize(50,50);
39
+ buttonCapture->setIconSize(QSize(40,40));
40
+ vblay->addWidget(buttonCapture,0,Qt::AlignCenter);
41
+ connect(buttonCapture, SIGNAL(clicked(bool)), this, SLOT(capture()));
42
+ connect(imageCapture, SIGNAL(imageCaptured(int,QImage)), this, SLOT(imageCaptured(int,QImage)));
43
+ hblay->addLayout(vblay);
44
+
45
+ vblay = new QVBoxLayout();
46
+ laPreview = new QLabel(this);
47
+ vblay->addWidget(laPreview,0,Qt::AlignCenter);
48
+ QPushButton * buttonSave = new QPushButton(imageSave,"",this);
49
+ buttonSave->setFixedSize(50,50);
50
+ buttonSave->setIconSize(QSize(35,35));
51
+
52
+ connect(buttonSave, SIGNAL(clicked(bool)), this, SLOT(saveCurrentImage()));
53
+ vblay->addWidget(buttonSave,0,Qt::AlignCenter);
54
+ hblay->addSpacing(4);
55
+ hblay->addLayout(vblay);
56
+ hblay->setMargin(1);
57
+ hblay->setSpacing(1);
58
+
59
+ currentImage = QImage(640,480,QImage::Format_ARGB32);
60
+ laPreview->setPixmap(QPixmap::fromImage(currentImage.scaledToWidth(videoWidget->size().width())));
61
+
62
+ camera->setCaptureMode(QCamera::CaptureViewfinder);
63
+ camera->focus()->setFocusMode(QCameraFocus::AutoFocus);
64
+ camera->exposure()->setExposureMode(QCameraExposure::ExposureAuto);
65
+ camera->exposure()->setAutoIsoSensitivity();
66
+
67
+ camera->setViewfinder(videoWidget);
68
+
69
+ connect(this, SIGNAL(rejected()), this, SLOT(error()));
70
+ connect(this, SIGNAL(rejected()), this, SLOT(deleteLater()), Qt::QueuedConnection);
71
+ camera->start();
72
+ camera->searchAndLock();
73
+
74
+ setFixedSize(minimumWidth(), minimumHeight());
75
+ }
76
+
77
+ CameraDialogView::~CameraDialogView()
78
+ {
79
+ controller->setDialogRejected();
80
+ }
81
+
82
+
83
+ void CameraDialogView::imageSaved(int id, const QString &fileName)
84
+ {
85
+ qDebug() << "IMSaved: " + fileName;
86
+ }
87
+
88
+
89
+ void CameraDialogView::error()
90
+ {
91
+ if (imageIsSaved) return;
92
+ qDebug() << "Error in Taking Picture";
93
+
94
+ rho::Hashtable<rho::String, rho::String>& mapRes = oResult.getStringHash();
95
+ mapRes["status"] = "error";
96
+ mapRes["message"] = "Dialog canceled without saving";
97
+ oResult.set(mapRes);
98
+ }
99
+
100
+
101
+ void CameraDialogView::capture()
102
+ {
103
+ buttonCapture->setIcon(imageCaptureClose);
104
+ imageCapture->capture("dev/null");
105
+ timerToRestoreCaptureButtonImage.start(300);
106
+ }
107
+
108
+ void CameraDialogView::imageCaptured(int id, const QImage &preview)
109
+ {
110
+ currentImage = preview;
111
+ laPreview->setPixmap(QPixmap::fromImage(currentImage.scaledToWidth(videoWidget->size().width())));
112
+ }
113
+
114
+
115
+ void CameraDialogView::saveCurrentImage()
116
+ {
117
+ imageIsSaved = true;
118
+ QDir dir = getImageDir();
119
+
120
+ QDate date = QDate::currentDate();
121
+ QTime time = QTime::currentTime();
122
+ QString fullPath = dir.absolutePath() + "/img" + QString::number(date.year()) +
123
+ QString::number(date.month()) + QString::number(date.day()) +
124
+ QString::number(time.hour()) + QString::number(time.minute()) +
125
+ QString::number(time.second()) + QString::number(time.msec()) + ".jpg";
126
+ if (currentImage.save(fullPath)){
127
+ rho::Hashtable<rho::String, rho::String>& mapRes = oResult.getStringHash();
128
+ getImageData(mapRes, fullPath);
129
+ oResult.set(mapRes);
130
+ reject();
131
+ }else{
132
+ rho::Hashtable<rho::String, rho::String>& mapRes = oResult.getStringHash();
133
+ mapRes["status"] = "error";
134
+ mapRes["message"] = "Error in saving image process";
135
+ oResult.set(mapRes);
136
+ reject();
137
+ }
138
+ }
139
+
140
+ void CameraDialogView::restoreCaptureButtonImage()
141
+ {
142
+ buttonCapture->setIcon(imageCaptureOpened);
143
+ }
144
+
145
+
146
+ void CameraDialogView::getImageData(rho::Hashtable<rho::String, rho::String> &mapRes, const QString &fileNameToOpen){
147
+ QImage image(fileNameToOpen);
148
+ if (image.isNull()){
149
+ mapRes["status"] = "error";
150
+ mapRes["message"] = "Image loading error";
151
+ return;
152
+ }
153
+ mapRes["status"] = "ok";
154
+
155
+ rho::String uri = QDir::current().relativeFilePath(fileNameToOpen).toStdString();
156
+ rho::String height = QString::number(image.height()).toStdString();
157
+ rho::String width = QString::number(image.width()).toStdString();
158
+ rho::String format = (QFileInfo(fileNameToOpen)).suffix().toStdString();
159
+
160
+ mapRes["imageUri"] = uri;
161
+ mapRes["imageHeight"] = height;
162
+ mapRes["imageWidth"] = width;
163
+ mapRes["imageFormat"] = format;
164
+
165
+ mapRes["image_uri"] = uri;
166
+ mapRes["image_height"] = height;
167
+ mapRes["image_width"] = width;
168
+ mapRes["image_format"] = format;
169
+ }
170
+
171
+ QDir CameraDialogView::getImageDir()
172
+ {
173
+ QDir dir = QDir(QDir::current().absolutePath()+"/db/db-files/");
174
+ if (!dir.exists()) dir.mkpath(dir.absolutePath());
175
+ return dir;
176
+ }
177
+
178
+