From b44ea1c69fc295dc5064651f717b0fbd23a6ab10 Mon Sep 17 00:00:00 2001 From: Maxim Ermilov Date: Sat, 26 Oct 2013 06:17:04 +0400 Subject: [PATCH 1/2] add ubuntu platform --- plugin.xml | 16 ++++ src/ubuntu/CaptureWidget.qml | 119 ++++++++++++++++++++++++++++ src/ubuntu/back.png | Bin 0 -> 12428 bytes src/ubuntu/camera.cpp | 143 ++++++++++++++++++++++++++++++++++ src/ubuntu/camera.h | 76 ++++++++++++++++++ src/ubuntu/shoot.png | Bin 0 -> 14430 bytes src/ubuntu/toolbar-left.png | Bin 0 -> 1212 bytes src/ubuntu/toolbar-middle.png | Bin 0 -> 4416 bytes src/ubuntu/toolbar-right.png | Bin 0 -> 1161 bytes 9 files changed, 354 insertions(+) create mode 100644 src/ubuntu/CaptureWidget.qml create mode 100644 src/ubuntu/back.png create mode 100644 src/ubuntu/camera.cpp create mode 100644 src/ubuntu/camera.h create mode 100644 src/ubuntu/shoot.png create mode 100644 src/ubuntu/toolbar-left.png create mode 100644 src/ubuntu/toolbar-middle.png create mode 100644 src/ubuntu/toolbar-right.png diff --git a/plugin.xml b/plugin.xml index 1327534..53b5529 100644 --- a/plugin.xml +++ b/plugin.xml @@ -44,6 +44,22 @@ + + + + + + + + + + + + + + + + diff --git a/src/ubuntu/CaptureWidget.qml b/src/ubuntu/CaptureWidget.qml new file mode 100644 index 0000000..e3fe20e --- /dev/null +++ b/src/ubuntu/CaptureWidget.qml @@ -0,0 +1,119 @@ +/* + * + * Copyright 2013 Canonical Ltd. + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ +import QtQuick 2.0 +import QtMultimedia 5.0 + +Rectangle { + property string shootImagePath: "shoot.png" + function isSuffix(str, suffix) { + return String(str).substr(String(str).length - suffix.length) == suffix + } + + id: ui + color: "#252423" + anchors.fill: parent + + Camera { + objectName: "camera" + id: camera + onError: { + console.log(errorString); + } + videoRecorder.audioBitRate: 128000 + videoRecorder.mediaContainer: "mp4" + imageCapture { + onImageSaved: { + root.exec("Camera", "onImageSaved", [path]); + ui.destroy(); + } + } + } + VideoOutput { + id: output + source: camera + width: parent.width + height: parent.height + } + + Item { + anchors.bottom: parent.bottom + width: parent.width + height: shootButton.height + BorderImage { + id: leftBackground + anchors.left: parent.left + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.right: middle.left + anchors.topMargin: units.dp(2) + anchors.bottomMargin: units.dp(2) + source: "toolbar-left.png" + Image { + anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.left + anchors.leftMargin: parent.iconSpacing + source: "back.png" + width: units.gu(6) + height: units.gu(5) + MouseArea { + anchors.fill: parent + onClicked: { + root.exec("Camera", "cancel"); + } + } + } + } + BorderImage { + id: middle + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.horizontalCenter: parent.horizontalCenter + height: shootButton.height + units.gu(1) + width: shootButton.width + source: "toolbar-middle.png" + Image { + id: shootButton + width: units.gu(8) + height: width + anchors.horizontalCenter: parent.horizontalCenter + source: shootImagePath + MouseArea { + anchors.fill: parent + onClicked: { + camera.imageCapture.capture(); + } + } + } + } + BorderImage { + id: rightBackground + anchors.right: parent.right + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.left: middle.right + anchors.topMargin: units.dp(2) + anchors.bottomMargin: units.dp(2) + source: "toolbar-right.png" + } + } +} diff --git a/src/ubuntu/back.png b/src/ubuntu/back.png new file mode 100644 index 0000000000000000000000000000000000000000..af78faa837ce940e2818f5a8fcd2f88e1de27bda GIT binary patch literal 12428 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 C%sA`- literal 0 HcmV?d00001 diff --git a/src/ubuntu/camera.cpp b/src/ubuntu/camera.cpp new file mode 100644 index 0000000..eada5dc --- /dev/null +++ b/src/ubuntu/camera.cpp @@ -0,0 +1,143 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +#include "camera.h" +#include + +#include +#include +#include +#include +#include + +const char code[] = "\ +var component, object; \ +function createObject() { \ + component = Qt.createComponent(%1); \ + if (component.status == Component.Ready) \ + finishCreation(); \ + else \ + component.statusChanged.connect(finishCreation); \ +} \ +function finishCreation() { \ + CordovaWrapper.object = component.createObject(root, \ + {root: root, cordova: cordova}); \ +} \ +createObject()"; + + +Camera::Camera(Cordova *cordova): + CPlugin(cordova), + _lastScId(0), + _lastEcId(0) { +} + +bool Camera::preprocessImage(QString &path) { + bool convertToPNG = (*_options.find("encodingType")).toInt() == Camera::PNG; + int quality = (*_options.find("quality")).toInt(); + int width = (*_options.find("targetWidth")).toInt(); + int height = (*_options.find("targetHeight")).toInt(); + + QImage image(path); + if (width <= 0) + width = image.width(); + if (height <= 0) + height = image.height(); + image = image.scaled(width, height, Qt::KeepAspectRatio, Qt::SmoothTransformation); + + QFile oldImage(path); + QTemporaryFile newImage; + + const char *type; + if (convertToPNG) { + newImage.setFileTemplate("imgXXXXXX.png"); + type = "png"; + } else { + newImage.setFileTemplate("imgXXXXXX.jpg"); + type = "jpg"; + } + + newImage.open(); + newImage.setAutoRemove(false); + image.save(newImage.fileName(), type, quality); + + path = newImage.fileName(); + oldImage.remove(); + + return true; +} + +void Camera::onImageSaved(QString path) { + bool dataURL = _options.find("destinationType")->toInt() == Camera::DATA_URL; + + QString cbParams; + if (preprocessImage(path)) { + QString absolutePath = QFileInfo(path).absoluteFilePath(); + if (dataURL) { + QFile image(absolutePath); + image.open(QIODevice::ReadOnly); + QByteArray content = image.readAll().toBase64(); + cbParams = QString("\"%1\"").arg(content.data()); + image.remove(); + } else { + cbParams = CordovaInternal::format(QUrl::fromLocalFile(absolutePath).toString()); + } + } + + this->callback(_lastScId, cbParams); + + _lastEcId = _lastScId = 0; +} + +void Camera::takePicture(int scId, int ecId, int quality, int destinationType, int/*sourceType*/, int targetWidth, int targetHeight, int encodingType, + int/*mediaType*/, bool/*allowEdit*/, bool/*correctOrientation*/, bool/*saveToPhotoAlbum*/, const QVariantMap &/*popoverOptions*/, int/*cameraDirection*/) { + if (_camera.isNull()) { + _camera = QSharedPointer(new QCamera()); + } + + if (((_lastScId || _lastEcId) && (_lastScId != scId && _lastEcId != ecId)) || !_camera->isAvailable() || _camera->lockStatus() != QCamera::Unlocked) { + this->cb(_lastEcId, "Device is busy"); + return; + } + + _options.clear(); + _options.insert("quality", quality); + _options.insert("destinationType", destinationType); + _options.insert("targetWidth", targetWidth); + _options.insert("targetHeight", targetHeight); + _options.insert("encodingType", encodingType); + + _lastScId = scId; + _lastEcId = ecId; + + QString path = m_cordova->get_app_dir() + "/../qml/CaptureWidget.qml"; + + // TODO: relative url + QString qml = QString(code).arg(CordovaInternal::format(path)); + m_cordova->execQML(qml); +} + +void Camera::cancel() { + m_cordova->execQML("CordovaWrapper.object.destroy()"); + this->cb(_lastEcId, "canceled"); + + _lastEcId = _lastScId = 0; +} diff --git a/src/ubuntu/camera.h b/src/ubuntu/camera.h new file mode 100644 index 0000000..aa06698 --- /dev/null +++ b/src/ubuntu/camera.h @@ -0,0 +1,76 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +#ifndef CAMERA_H +#define CAMERA_H + +#include + +#include +#include +#include +#include +#include + +class Camera: public CPlugin { + Q_OBJECT +public: + explicit Camera(Cordova *cordova); + + virtual const QString fullName() override { + return Camera::fullID(); + } + + virtual const QString shortName() override { + return "Camera"; + } + + static const QString fullID() { + return "Camera"; + } + +public slots: + void takePicture(int scId, int ecId, int quality, int destinationType, int/*sourceType*/, int targetWidth, int targetHeight, int encodingType, + int/*mediaType*/, bool/*allowEdit*/, bool/*correctOrientation*/, bool/*saveToPhotoAlbum*/, const QVariantMap &popoverOptions, int cameraDirection); + void cancel(); + + void onImageSaved(QString path); + +private: + bool preprocessImage(QString &path); + + int _lastScId; + int _lastEcId; + QSharedPointer _camera; + + QVariantMap _options; +protected: + enum DestinationType { + DATA_URL = 0, + FILE_URI = 1 + }; + enum EncodingType { + JPEG = 0, + PNG = 1 + }; +}; + +#endif // CAMERA_H diff --git a/src/ubuntu/shoot.png b/src/ubuntu/shoot.png new file mode 100644 index 0000000000000000000000000000000000000000..c093b633c886b1ebd03925113c66c49ac53f50b0 GIT binary patch literal 14430 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 literal 0 HcmV?d00001 diff --git a/src/ubuntu/toolbar-left.png b/src/ubuntu/toolbar-left.png new file mode 100644 index 0000000000000000000000000000000000000000..720d7f601675cb18b2394fedb47dc43805df7adf GIT binary patch literal 1212 zcmeAS@N?(olHy`uVBq!ia0y~yU}OWb=Ws9s$yJG8=K}>g1AIbU|D%HX`ue?l_rk@_ zoH+w$BQx~$^wibWAtE0?esp$r{`Kn@kn8X74$p2$-0F2n4dSGJzyBGY~-m3k$QOqhnfH8j!&P z2CS?sV8jaKv9hwVu>lDdAjt-1K^S3SVL)Sn;_U2fT3VVA1HsDJczC$^`1sV-)xh>L zNlHorodk3M4-XGe1ZXRel$V!>+0P7i53``4pqQ8#P!OmLA_7qWbOW3LbO$FVCr||D z5;m9%K~4k;va_>87;rMvh&={qeRD~WUoZnR3mZEJ2fv_@sEoXdnzoL$hnJVPZ*X)> zLRv{#d1Z5RTU%G}^yxEa%?5%wbLY;TH*fy@`3n{T!JNRWDu3fi&!$u(3v}yC^EnBy4+YSUfcI@1_YuB#byLa!|vv==4c3+`X zU|__1x;TbZ+OE-f7&?D@}I`tyzkfj1A}hA ze{p}`mMey*`;Qzt^gVyRYs%fmr*Y3;|K4f-w(R%P#5j$!X`fe~xNtD;dGPC#SGjxJ zo?kulXxG)OrH?F9J>S05J$G-n#E;VT&sNQ}oU`v_(aMl1zU#%J%?~Yjcy-k;$D10e zp$?}{?>qO#H+12%FqyeWEm~{rrf+_F<#_upr>litRmL_WDd6QSPj? zc{ygYJx@zQ&=DswmJ{49u(#F$dc1aTo3!&nxOj@;e3>@RX5$yD8+lTGOn1CLVcJE> zWo(j0DGJPzCmh&}CIH1LXFeznvGY@7?&c0VAk{5uqFX}8w;MkaH;5B*qJPw=sue+Wii!L>(~orHkuW`Inwhk;g`_W-pA?5cO6>|s+PVx zG4Jz71(yfEc_&|aJ@41^uigqqTTBTiKS!{^-dBiF&&F KxvX*PxS literal 0 HcmV?d00001 diff --git a/src/ubuntu/toolbar-middle.png b/src/ubuntu/toolbar-middle.png new file mode 100644 index 0000000000000000000000000000000000000000..77595bb1332aee9326f86e496a6cf8dca6724327 GIT binary patch literal 4416 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 M8k!o^>bXAn7gDq;O#lD@ literal 0 HcmV?d00001 diff --git a/src/ubuntu/toolbar-right.png b/src/ubuntu/toolbar-right.png new file mode 100644 index 0000000000000000000000000000000000000000..e4e6aa6026a3bc336abf5c46223c4f0152ecd2da GIT binary patch literal 1161 zcmeAS@N?(olHy`uVBq!ia0y~yU}OQZ=Ws9s$#qjy7Xbwd1AIbU|099Ay1Ko4_re9v zo;?d^!x`%8>Uw&55bpc;@132UfBpIe-}+aZ9Fk%5tsao)UnKoSU;n1Bcbva&LPBr`J*K>-U3v!kP9YHBKw!2$-X ztSn%}3IuFytUz@@E|9^-#>U6T2VsPTg#oPqinFt`X=!P}&4kGE@NffFs;jF3tp?f! zbR^JKV21#?%u-TP5WB&;m<0p`#KgpaA`mV+J3B-cNCKS$AvriWfVKmu1L4Lsu%q(mi9Q=YpVlwh7YT7!Uo?hO5!7(ujX(eUlmCenqZQavn%$zkF z23T_2sUlr zym`ykZQHhQ-@aq#&Yin zZ+-VWOhL%umWmV;=d4>R3h#@GUJ1LiYHQNLx+-<&^B?Ej`+n$i{d{k|`;yP}>{+1^ z3ZgdLtm9{Ew!an7v$fRQ{M@_St9stsPoG{dSsNG@zFDsS`|~N+^0wd4$WMJ)wp(6o z|DPB9*ZcA>3(6cXwLSm+^&%F>&6RJjoj$ky--jbJg0|i|v&Q(*sfRzmE)aCPK3{JQ z5C78;)8NaRDkuH!tY$x}vG00h<#z9zWjkY5dM)O^Tlja^x`O(J^&wM@wrQjmzcD@j zaTAyRzPJ$A)0@0L-I$t{d+lSh!Myi-!hbdeiX1-mf+w|B{7#i}SG?}ZJvOXor9wY^ z3ElBK@@cA;i1$*j(qmWGAA0Mb^-Dfdbj_r->zm|VKHHk=28B7sw_g13=sw|OOlwi7 zeQ)9(4eO>#kq!kLr?~w+E*k6HGXxtsTojlDI~-V)1Sn>HDAbtGDctz7;eU}!ljX#W zb;mdOO!+cHqHFTJH5)aPAKwW175L{(gtlkAvBPw`9ZGdw2A=chPP6lxx#Z>N=0(pv zeVf~#t3Tzt+7_stJt1!1t(7+Rzcn*VW;L}WiX63SEc^PQ!tbS;RoBHyis#O#svVrm z?f$JtGj-OHPK}ixUz|MatM*|Tm;48FA_Lb$p-|30t~frA?{^^95F Vdv8wr^Q;LZ=;`X`vd$@?2>|~T#2)|v literal 0 HcmV?d00001 From 885c6a745987e17538b545fdfa6fe1ddcb620f94 Mon Sep 17 00:00:00 2001 From: Maxim Ermilov Date: Mon, 11 Nov 2013 17:59:22 +0400 Subject: [PATCH 2/2] [ubuntu] specify policy_group --- plugin.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugin.xml b/plugin.xml index 53b5529..a7da775 100644 --- a/plugin.xml +++ b/plugin.xml @@ -46,6 +46,11 @@ + + + + +