rhodes 5.5.2 → 5.5.15
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CONTRIBUTING.md +1 -1
- data/CREDITS +3 -3
- data/LICENSE +1 -1
- data/README.html +1 -1
- data/Rakefile +53 -14
- data/bin/get-rhodes-info +0 -0
- data/extensions/rhoconnect-push/ext/rhoconnect-push/platform/android/Rakefile +1 -1
- data/lib/build/jake.rb +11 -0
- data/lib/commonAPI/barcode/ext/platform/iphone/impl/BarcodeFactory.m +2 -1
- data/lib/commonAPI/coreapi/ext/NativeTabbar.xml +4 -0
- data/lib/commonAPI/coreapi/ext/platform/iphone/cpp_based_impl/SystemImpl.mm +1 -0
- data/lib/commonAPI/coreapi/ext/platform/iphone/impl/NativeTabbarSingleton.m +7 -2
- data/lib/commonAPI/coreapi/ext/platform/iphone/impl/NativeToolbarSingleton.m +6 -2
- data/lib/commonAPI/coreapi/ext/platform/iphone/impl/NavbarSingleton.m +8 -2
- data/lib/commonAPI/coreapi/ext/shared/ApplicationImpl.cpp +3 -0
- data/lib/commonAPI/coreapi/ext/shared/NetworkImpl.cpp +1 -0
- data/lib/commonAPI/coreapi/ext/shared/TimerImpl.cpp +36 -27
- data/lib/commonAPI/coreapi/public/api/rhoapi.js +6 -3
- data/lib/commonAPI/mediacapture/ext.yml +1 -2
- data/lib/commonAPI/mediacapture/ext/build.bat +8 -0
- data/lib/commonAPI/mediacapture/ext/platform/qt/MediaCapture.pro +82 -0
- data/lib/commonAPI/mediacapture/ext/platform/qt/Rakefile +35 -0
- data/lib/commonAPI/mediacapture/ext/platform/qt/resources/diaClosed.png +0 -0
- data/lib/commonAPI/mediacapture/ext/platform/qt/resources/diaOpened.png +0 -0
- data/lib/commonAPI/mediacapture/ext/platform/qt/resources/mediacapture.qrc +7 -0
- data/lib/commonAPI/mediacapture/ext/platform/qt/resources/photoSave.png +0 -0
- data/lib/commonAPI/mediacapture/ext/platform/qt/src/CCameraData.cpp +83 -0
- data/lib/commonAPI/mediacapture/ext/platform/qt/src/CCameraData.h +54 -0
- data/lib/commonAPI/mediacapture/ext/platform/qt/src/CameraDialogBuilder.h +36 -0
- data/lib/commonAPI/mediacapture/ext/platform/qt/src/CameraDialogController.h +31 -0
- data/lib/commonAPI/mediacapture/ext/platform/qt/src/CameraDialogView.h +73 -0
- data/lib/commonAPI/mediacapture/ext/platform/qt/src/Camera_impl.cpp +337 -0
- data/lib/commonAPI/mediacapture/ext/platform/qt/src/ImageFileNameGetter.h +40 -0
- data/lib/commonAPI/mediacapture/ext/platform/qt/src/ImageFilenameGetterResult.h +36 -0
- data/lib/commonAPI/mediacapture/ext/platform/qt/src/cameracrossthreadhalper.h +17 -0
- data/lib/commonAPI/mediacapture/ext/platform/qt/src/cameradialogview.cpp +178 -0
- data/lib/commonAPI/mediacapture/ext/shared/MediacaptureInit.cpp +8 -8
- data/lib/framework/rhodes.rb +1 -1
- data/lib/framework/version.rb +1 -1
- data/platform/android/Rhodes/AndroidManifest.xml.erb +1 -1
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/RhodesService.java +9 -2
- data/platform/android/Rhodes/src/com/rhomobile/rhodes/mainview/SplashScreen.java +33 -0
- data/platform/android/build/android.rake +97 -43
- data/platform/android/build/android_studio_project_generator.rb +21 -0
- data/platform/android/build/android_tools.rb +8 -6
- data/platform/iphone/Classes/AppManager/AppManager.h +6 -0
- data/platform/iphone/Classes/AppManager/AppManager.m +76 -37
- data/platform/iphone/Classes/MapView/GoogleGeocoder.m +2 -3
- data/platform/iphone/Classes/MapView/MapViewController.m +3 -3
- data/platform/iphone/Classes/NativeBar.h +1 -0
- data/platform/iphone/Classes/NativeBar.m +15 -0
- data/platform/iphone/Classes/RhoViewController.m +8 -3
- data/platform/iphone/Classes/RhoWKWebView.m +1 -1
- data/platform/iphone/Classes/Rhodes.m +55 -38
- data/platform/iphone/Classes/SimpleMainView.m +3 -2
- data/platform/iphone/Classes/TabbedMainView.h +2 -0
- data/platform/iphone/Classes/TabbedMainView.m +15 -3
- data/platform/iphone/Classes/URLProtocol/CRhoURLProtocol.h +2 -0
- data/platform/iphone/Classes/URLProtocol/CRhoURLProtocol.m +185 -30
- data/platform/iphone/Classes/rho/net/IPhoneNetRequest.mm +105 -6
- data/platform/iphone/rbuild/iphone.rake +426 -267
- data/platform/iphone/rbuild/putsOverride.rake +8 -0
- data/platform/shared/api_generator/iphone/CJSConverter.mm +5 -3
- data/platform/shared/common/BundleManager.cpp +16 -6
- data/platform/shared/common/PosixThreadImpl.cpp +10 -4
- data/platform/shared/common/RhoTime.cpp +81 -40
- data/platform/shared/common/RhodesApp.cpp +2 -2
- data/platform/shared/common/RhodesApp.h +1 -1
- data/platform/shared/db/DBAdapter.cpp +33 -0
- data/platform/shared/db/DBAdapter.h +5 -0
- data/platform/shared/logging/RhoLogConf.cpp +17 -1
- data/platform/shared/logging/RhoLogConf.h +6 -0
- data/platform/shared/net/CURLNetRequest.cpp +6 -0
- data/platform/shared/net/HttpServer.cpp +27 -1
- data/platform/shared/net/INetRequest.cpp +33 -6
- data/platform/shared/net/INetRequest.h +2 -0
- data/platform/shared/qt/RhoSimulator_dev.pro +14 -10
- data/platform/shared/qt/rhodes/QtMainWindow.cpp +2 -2
- data/platform/shared/qt/rhodes/iexecutable.h +27 -0
- data/platform/shared/qt/rhodes/impl/MainWindowImpl.cpp +5 -0
- data/platform/shared/qt/rhodes/impl/MainWindowImpl.h +3 -0
- data/platform/shared/qt/rhodes/qkineticscroller.cpp +2 -2
- data/platform/shared/qt/rhodes/qkineticscroller_p.h +1 -1
- data/platform/shared/qt/rhodes/qtscrollerfilter.cpp +3 -3
- data/platform/shared/qt/rhodes/qtscrollevent.cpp +2 -2
- data/platform/shared/qt/rhodes/qwebviewkineticscroller.cpp +1 -1
- data/platform/shared/qt/rhodes/qwebviewkineticscroller.h +1 -1
- data/platform/shared/qt/rhodes/resources/rho.png +0 -0
- data/platform/shared/qt/rhodes/rhodes.pro +3 -2
- data/platform/wm/build/wm.rake +28 -9
- data/platform/wm/rhodes/browser/BrowserFactory.cpp +4 -6
- data/platform/wm/rhodes/browser/stubs.cpp +5 -0
- data/platform/wm/rhodes/rho/net/NetRequestImpl.h +3 -0
- data/platform/wm/rhodes/rhodes.vcproj +31 -2
- data/rakefile.rb +53 -14
- data/res/build-tools/iphonesim/build/Release/iphonesim_8 +2 -2
- data/res/generators/rhogen.rb +6 -147
- data/res/generators/templates/api/platform/iphone/generated/base_impl/MontanaBase.m +7 -7
- data/res/generators/templates/api/platform/iphone/generated/javascript/montana_js_wrap.mm +2 -4
- data/res/generators/templates/application/AndroidManifest.erb +1 -1
- data/res/generators/templates/application/app/Settings/home.erb +1 -1
- data/res/generators/templates/application/build.yml +52 -6
- data/res/generators/templates/application/icon/icon.png +0 -0
- data/res/generators/templates/application/resources/android/res/drawable-hdpi/ic_notification.png +0 -0
- data/res/generators/templates/application/resources/android/res/drawable-hdpi/icon.png +0 -0
- data/res/generators/templates/application/resources/android/res/drawable-hdpi/loading.png +0 -0
- data/res/generators/templates/application/resources/android/res/drawable-ldpi/ic_notification.png +0 -0
- data/res/generators/templates/application/resources/android/res/drawable-ldpi/icon.png +0 -0
- data/res/generators/templates/application/resources/android/res/drawable-ldpi/loading.png +0 -0
- data/res/generators/templates/application/resources/android/res/drawable-mdpi/ic_notification.png +0 -0
- data/res/generators/templates/application/resources/android/res/drawable-mdpi/icon.png +0 -0
- data/res/generators/templates/application/resources/android/res/drawable-mdpi/loading.png +0 -0
- data/res/generators/templates/application/resources/android/res/drawable-xhdpi/ic_notification.png +0 -0
- data/res/generators/templates/application/resources/android/res/drawable-xhdpi/icon.png +0 -0
- data/res/generators/templates/application/resources/android/res/drawable-xhdpi/loading.png +0 -0
- data/res/generators/templates/application/resources/android/res/drawable-xxhdpi/ic_notification.png +0 -0
- data/res/generators/templates/application/resources/android/res/drawable-xxhdpi/icon.png +0 -0
- data/res/generators/templates/application/resources/android/res/drawable-xxhdpi/loading.png +0 -0
- data/res/generators/templates/application/resources/android/res/drawable-xxxhdpi/ic_notification.png +0 -0
- data/res/generators/templates/application/resources/android/res/drawable-xxxhdpi/icon.png +0 -0
- data/res/generators/templates/application/resources/android/res/drawable-xxxhdpi/loading.png +0 -0
- data/res/generators/templates/application/resources/android/res/drawable/ic_notification.png +0 -0
- data/res/generators/templates/application/resources/android/res/drawable/icon.png +0 -0
- data/res/generators/templates/application/resources/android/res/drawable/loading.png +0 -0
- data/res/generators/templates/application/resources/android/res/mipmap-hdpi/icon.png +0 -0
- data/res/generators/templates/application/resources/android/res/mipmap-ldpi/icon.png +0 -0
- data/res/generators/templates/application/resources/android/res/mipmap-mdpi/icon.png +0 -0
- data/res/generators/templates/application/resources/android/res/mipmap-xhdpi/icon.png +0 -0
- data/res/generators/templates/application/resources/android/res/mipmap-xxhdpi/icon.png +0 -0
- data/res/generators/templates/application/resources/android/res/mipmap-xxxhdpi/icon.png +0 -0
- data/res/generators/templates/application/resources/android/res/mipmap/icon.png +0 -0
- data/res/generators/templates/application/{app/loading-568h@2x.png → resources/ios/Default-568h@2x.png} +0 -0
- data/res/generators/templates/application/{app/loading-667h@2x.png → resources/ios/Default-667h@2x.png} +0 -0
- data/res/generators/templates/application/{app/loading-736h@3x.png → resources/ios/Default-736h@3x.png} +0 -0
- data/res/generators/templates/application/{app/loading-Landscape.png → resources/ios/Default-Landscape.png} +0 -0
- data/res/generators/templates/application/{app/loading-Landscape@2x.png → resources/ios/Default-Landscape@2x.png} +0 -0
- data/res/generators/templates/application/{app/loading-LandscapeLeft.png → resources/ios/Default-LandscapeLeft.png} +0 -0
- data/res/generators/templates/application/{app/loading-LandscapeLeft@2x.png → resources/ios/Default-LandscapeLeft@2x.png} +0 -0
- data/res/generators/templates/application/{app/loading-LandscapeRight.png → resources/ios/Default-LandscapeRight.png} +0 -0
- data/res/generators/templates/application/{app/loading-LandscapeRight@2x.png → resources/ios/Default-LandscapeRight@2x.png} +0 -0
- data/res/generators/templates/application/{app/loading-Portrait.png → resources/ios/Default-Portrait.png} +0 -0
- data/res/generators/templates/application/{app/loading-Portrait@2x.png → resources/ios/Default-Portrait@2x.png} +0 -0
- data/res/generators/templates/application/{app/loading-PortraitUpsideDown.png → resources/ios/Default-PortraitUpsideDown.png} +0 -0
- data/res/generators/templates/application/{app/loading-PortraitUpsideDown@2x.png → resources/ios/Default-PortraitUpsideDown@2x.png} +0 -0
- data/res/generators/templates/application/resources/ios/Default.png +0 -0
- data/res/generators/templates/application/{app/loading@2x.png → resources/ios/Default@2x.png} +0 -0
- data/res/generators/templates/application/resources/ios/iTunesArtwork.png +0 -0
- data/res/generators/templates/application/resources/ios/iTunesArtwork@2x.png +0 -0
- data/res/generators/templates/application/resources/ios/icon114.png +0 -0
- data/res/generators/templates/application/resources/ios/icon120.png +0 -0
- data/res/generators/templates/application/resources/ios/icon144.png +0 -0
- data/res/generators/templates/application/resources/ios/icon152.png +0 -0
- data/res/generators/templates/application/resources/ios/icon180.png +0 -0
- data/res/generators/templates/application/resources/ios/icon57.png +0 -0
- data/res/generators/templates/application/resources/ios/icon60.png +0 -0
- data/res/generators/templates/application/resources/ios/icon72.png +0 -0
- data/res/generators/templates/application/resources/ios/icon76.png +0 -0
- data/res/generators/templates/application/rhoconfig.txt +2 -1
- data/res/generators/templates/iphone_project/Bremen7.xcodeproj/project.pbxproj +44 -0
- data/res/generators/templates/iphone_project/Resources/back_btn.png +0 -0
- data/res/generators/templates/iphone_project/Resources/back_btn@2x.png +0 -0
- data/res/generators/templates/iphone_project/Resources/back_btn@3x.png +0 -0
- data/res/generators/templates/iphone_project/Resources/forward_btn.png +0 -0
- data/res/generators/templates/iphone_project/Resources/forward_btn@2x.png +0 -0
- data/res/generators/templates/iphone_project/Resources/forward_btn@3x.png +0 -0
- data/res/generators/templates/iphone_project/Resources/gears.png +0 -0
- data/res/generators/templates/iphone_project/Resources/gears@2x.png +0 -0
- data/res/generators/templates/iphone_project/Resources/gears@3x.png +0 -0
- data/res/generators/templates/iphone_project/Resources/home_btn.png +0 -0
- data/res/generators/templates/iphone_project/Resources/home_btn@2x.png +0 -0
- data/res/generators/templates/iphone_project/Resources/home_btn@3x.png +0 -0
- data/res/generators/templates/iphone_project/Resources/sync_btn.png +0 -0
- data/res/generators/templates/iphone_project/Resources/sync_btn@2x.png +0 -0
- data/res/generators/templates/iphone_project/Resources/sync_btn@3x.png +0 -0
- data/res/generators/templates/iphone_project/buildRhoBundle +23 -7
- data/res/generators/templates/iphone_project/root/Info.plist +0 -7
- data/res/generators/templates/iphone_project/root/iTunesArtwork +0 -0
- data/res/generators/templates/iphone_project/root/iTunesArtwork@2x +0 -0
- data/res/generators/templates/iphone_project/root/icon114.png +0 -0
- data/res/generators/templates/iphone_project/root/icon120.png +0 -0
- data/res/generators/templates/iphone_project/root/icon144.png +0 -0
- data/res/generators/templates/iphone_project/root/icon152.png +0 -0
- data/res/generators/templates/iphone_project/root/icon180.png +0 -0
- data/res/generators/templates/iphone_project/root/icon57.png +0 -0
- data/res/generators/templates/iphone_project/root/icon60.png +0 -0
- data/res/generators/templates/iphone_project/root/icon72.png +0 -0
- data/res/generators/templates/iphone_project/root/icon76.png +0 -0
- data/res/generators/templates/project/android_studio_project/app/build.gradle.erb +88 -0
- data/res/generators/templates/project/android_studio_project/build.gradle +23 -0
- data/res/generators/templates/project/android_studio_project/gradle.properties +17 -0
- data/res/generators/templates/project/android_studio_project/gradlew +160 -0
- data/res/generators/templates/project/android_studio_project/gradlew.bat +90 -0
- data/res/generators/templates/project/android_studio_project/settings.gradle +1 -0
- data/rhodes.gemspec +7 -6
- data/version +1 -1
- metadata +135 -42
- data/res/generators/templates/application/icon/icon.svg +0 -22
- data/res/generators/templates/application/icon/icon114.png +0 -0
- data/res/generators/templates/application/icon/icon120.png +0 -0
- data/res/generators/templates/application/icon/icon144.png +0 -0
- data/res/generators/templates/application/icon/icon152.png +0 -0
- data/res/generators/templates/application/icon/icon180.png +0 -0
- data/res/generators/templates/application/icon/icon57.png +0 -0
- data/res/generators/templates/application/icon/icon60.png +0 -0
- data/res/generators/templates/application/icon/icon72.png +0 -0
- data/res/generators/templates/application/icon/icon76.png +0 -0
- data/res/generators/templates/application/production/iTunesArtwork.png +0 -0
- 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
|
+
|