diff --git a/communicator/LICENSE b/communicator/LICENSE new file mode 100644 index 0000000..23b90f3 --- /dev/null +++ b/communicator/LICENSE @@ -0,0 +1,229 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed 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. +------------------------------------------------------- + +This software contains icons from Pixle +Subway Icons Set for RIM BB10 Dev Samples: http://subway.pixle.pl/rim/ +Licensed under the Creative Commons Attribution 3.0 Unported +http://creativecommons.org/licenses/by/3.0/ + +------------------------------------------------------- + +This software contains icons from Myers Design Limited +250 FREE PNGs for Your BB10 Apps: http://myersdesign.com/bb10-icons-2013/ +Licensed under the Creative Commons Attribution 3.0 Unported +http://creativecommons.org/licenses/by/3.0/ + +------------------------------------------------------- + +This software contains icons from Blue Bits icons, by Stan Khodjaev +Blue Bits Basic and Bonus icon sets: http://www.icojam.com/blog/?p=253 +Licensed under Public Domain http://creativecommons.org/publicdomain/mark/1.0/ + +------------------------------------------------------- + +This software contains images from flickr.com, by familymwr +Photographers expand horizons in 2010 Army Digital Photography Contest 110311 sets: http://www.flickr.com/photos/familymwr/5546845817/ +[adapted] Cropped. +Licensed under the Creative Commons Attribution 2.0 Generic +http://creativecommons.org/licenses/by/2.0/ \ No newline at end of file diff --git a/communicator/Makefile b/communicator/Makefile new file mode 100644 index 0000000..f22f5ac --- /dev/null +++ b/communicator/Makefile @@ -0,0 +1,6 @@ +QMAKE_TARGET = communicator +PROJECT_DIR := $(dir $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))) +I18N_DIR := $(PROJECT_DIR)/translations + +include mk/cs-base.mk + diff --git a/communicator/README.md b/communicator/README.md new file mode 100644 index 0000000..88c6a1b --- /dev/null +++ b/communicator/README.md @@ -0,0 +1,67 @@ +# Communicator -- Telephony Sample + +Cascades provides basic Phone APIs that you can use to show the dial pad, start a call, or listen to call-related notifications. + +You will learn how to: +- Use the Phone class to init a call, open dialpad with preselected number and invoke system call logs +- Listen to Call Updated signal +- Invoke SMS Composer with a preselected number and loading the previous chat if any. For details about SMS & MMS , Please check [the SmsMessageService sample](https://github.com/blackberry/Cascades-Community-Samples/tree/master/SmsMessageService) +- Play multiple sound files(.wav) Simultaneously using OpenAL Lib + +The sample code for this application is Open Source under the [Apache 2.0 License](http://www.apache.org/licenses/LICENSE-2.0.html). + +**Applies To** + +* [Cascades for BlackBerry 10](https://bdsc.webapps.blackberry.com/cascades/) +* [BlackBerry Native SDK](http://developer.blackberry.com/native/) + +**Author** + +* [Kareem ELSayed](https://github.com/kemobyte) + +**Release History** + +* **V1.0.0** - Initial release + +**Dependencies** + +1. Minimal requirement for BlackBerry 10 Device Software is **10.2.0** +2. Minimal requirement for BlackBerry 10 Native SDK is **10.2.0** + +**How to Run the Communicator Sample** + +Simply import the project into a workspace in your NDK. +1. Download the source code +2. Launch Momentics IDE, and from the File menu, select Import. +3. Expand General, and select Existing Projects into Workspace. Click Next. +4. Browse to the location of the source code project, and then click OK. +5. The sample project should display in the the Projects section. +6. Click Finish to import the project into your workspace. + + +**To contribute code to this repository you must be [signed up as an official contributor](http://blackberry.github.com/howToContribute.html).** + + +**Known Issues** + +* None + + +## Contributing Changes + +Please see the [README](https://github.com/blackberry/Cascades-Community-Samples/blob/master/README.md) of the Cascades-Community-Samples repository for instructions on how to add new Samples or make modifications to existing Samples. + + +## Bug Reporting and Feature Requests + +If you find a bug in a Sample, or have an enhancement request, simply file an [Issue](https://github.com/blackberry/Cascades-Community-Samples/issues) for the Sample and send a message (via github messages) to the Sample Author(s) to let them know that you have filed an [Issue](https://github.com/blackberry/Cascades-Community-Samples/issues). If you have a solution to an issue you can contribute your fix and issue a Pull Request to have it reviewed and integrated into the main repo. + + +## Disclaimer + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE +AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR +ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/communicator/assets/.assets.index b/communicator/assets/.assets.index new file mode 100644 index 0000000..800fe04 --- /dev/null +++ b/communicator/assets/.assets.index @@ -0,0 +1,62 @@ +1 +60 +720x720/images/Hash-icon.png +720x720/images/Math-lower-than-icon.png +720x720/images/Math-multiply-icon.png +720x720/images/Number-0-icon.png +720x720/images/Number-1-icon.png +720x720/images/Number-2-icon.png +720x720/images/Number-3-icon.png +720x720/images/Number-4-icon.png +720x720/images/Number-5-icon.png +720x720/images/Number-6-icon.png +720x720/images/Number-7-icon.png +720x720/images/Number-8-icon.png +720x720/images/Number-9-icon.png +720x720/main.qml +audio/wav/cell-phone-1-nr0.wav +audio/wav/cell-phone-1-nr1.wav +audio/wav/cell-phone-1-nr2.wav +audio/wav/cell-phone-1-nr3.wav +audio/wav/cell-phone-1-nr4.wav +audio/wav/cell-phone-1-nr5.wav +audio/wav/cell-phone-1-nr6.wav +audio/wav/cell-phone-1-nr7.wav +audio/wav/cell-phone-1-nr8.wav +audio/wav/cell-phone-1-nr9.wav +CustomDialpadView.qml +CustomSMSComposer.qml +images/CallsLog.png +images/Hash-icon.png +images/ic_phone.png +images/ic_show_dialpad.png +images/ic_textmessage.png +images/Math-lower-than-icon.png +images/Math-multiply-icon.png +images/Number-0-icon.png +images/Number-1-icon.png +images/Number-2-icon.png +images/Number-3-icon.png +images/Number-4-icon.png +images/Number-5-icon.png +images/Number-6-icon.png +images/Number-7-icon.png +images/Number-8-icon.png +images/Number-9-icon.png +images/phone81.png +main.qml +splash/Black-Wood-Background-720x1280.jpg +splash/Black-Wood-Background-768x1280.jpg +ToTest/Hash-icon.png +ToTest/Math-lower-than-icon.png +ToTest/Math-multiply-icon.png +ToTest/Number-0-icon.png +ToTest/Number-1-icon.png +ToTest/Number-2-icon.png +ToTest/Number-3-icon.png +ToTest/Number-4-icon.png +ToTest/Number-5-icon.png +ToTest/Number-6-icon.png +ToTest/Number-7-icon.png +ToTest/Number-8-icon.png +ToTest/Number-9-icon.png diff --git a/communicator/assets/720x720/main.qml b/communicator/assets/720x720/main.qml new file mode 100644 index 0000000..491feff --- /dev/null +++ b/communicator/assets/720x720/main.qml @@ -0,0 +1,122 @@ +/* Copyright (c) 2013 BlackBerry Limited. + * + * Licensed 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 bb.cascades 1.0 +import bb.system.phone 1.0 +import bb.multimedia 1.0 +import bb.system 1.0 + +// This is the application Page with a Container as content, all UI components are children to that Container. + +Page { + actionBarVisibility: ChromeVisibility.Overlay + onCreationCompleted: { + Qt.phone = phone; + phone.callUpdated.connect(communicatorApp.onCallUpdated); + } + actions: [ + ActionItem { + title: "Log" + ActionBar.placement: ActionBarPlacement.InOverflow + imageSource: "asset:///images/CallsLog.png" + onTriggered: { + phone.initiateCellularCall("") + } + }, + ActionItem { + title: "SMS" + ActionBar.placement: ActionBarPlacement.InOverflow + imageSource: "asset:///images/031.Chat.png" + onTriggered: { + tSMSDialog.show() + } + }, + ActionItem { + title: "Dailpad" + ActionBar.placement: ActionBarPlacement.InOverflow + imageSource: "asset:///images/icon_127.png" + onTriggered: { + phone.requestDialpad(dialPadCtn.phoneNumber) + } + } + ] + attachedObjects: [ + Phone { + id: phone + }, + ComponentDefinition { + id: customSMSSheet + source: "CustomSMSComposer.qml" + }, + SystemDialog { + id: tSMSDialog + title: "How you want to Compose SMS" + confirmButton.label: "Invoke System Composer" + customButton.label: "In App Composer" + buttonAreaLimit: 1 + onFinished: { + var x = result; + if (x == SystemUiResult.ConfirmButtonSelection) { + communicatorApp.InvokeSmsComposer(dialPadCtn.phoneNumber) + } else if (x == SystemUiResult.CustomButtonSelection) { + var sheet = customSMSSheet.createObject() + sheet.syncPhoneNumber(dialPadCtn.phoneNumber) + sheet.open(); + } + } + } + ] + ScrollView { + Container { + verticalAlignment: VerticalAlignment.Fill + horizontalAlignment: HorizontalAlignment.Fill + layout: DockLayout { + } + ImageView { + horizontalAlignment: HorizontalAlignment.Fill + verticalAlignment: VerticalAlignment.Fill + imageSource: "asset:///images/communicatorBG2.png" + } + Container { + CustomDialpadView { + id: dialPadCtn + topPadding: 15 + bottomMargin: 10 + } + Container { + verticalAlignment: VerticalAlignment.Fill + horizontalAlignment: HorizontalAlignment.Fill + leftPadding: 55 + Divider {} + Label { + text: "Call Updated Log:" + textStyle.base: SystemDefaults.TextStyles.SubtitleText + textStyle.color: Color.White + } + TextArea { + topPadding: 0 + objectName: "CallInfoTxt" + hintText: "" + backgroundVisible: false; + scrollMode: TextAreaScrollMode.Elastic + textStyle.base: SystemDefaults.TextStyles.SmallText + textStyle.color: Color.White + focusPolicy: FocusPolicy.None + editable: false + } + } + } + } + } +} diff --git a/communicator/assets/CustomDialpadView.qml b/communicator/assets/CustomDialpadView.qml new file mode 100644 index 0000000..2cdf7c0 --- /dev/null +++ b/communicator/assets/CustomDialpadView.qml @@ -0,0 +1,235 @@ +/* Copyright (c) 2013 BlackBerry Limited. + * + * Licensed 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 bb.cascades 1.2 +import bb.system.phone 1.0 + +Container { + property alias phoneNumber: phoneNumbertxt.text + property int topMarginVal: 15 + property int leftMarginVal: 80 + property int callBtnLeftMarginVal: 105 + TextField { + id: phoneNumbertxt + objectName: "phoneNumbertxt" + hintText: "Enter Number" + backgroundVisible: false + focusPolicy: FocusPolicy.None + textStyle.color: Color.White + textStyle.fontSize: FontSize.XXLarge + textStyle.fontFamily: "Tahoma" + textStyle.textAlign: TextAlign.Center + } + Container { + topMargin: topMarginVal + horizontalAlignment: HorizontalAlignment.Center + verticalAlignment: VerticalAlignment.Center + Container { + layout: StackLayout { + orientation: LayoutOrientation.LeftToRight + } + horizontalAlignment: HorizontalAlignment.Center + verticalAlignment: VerticalAlignment.Center + ImageButton { + defaultImageSource: "asset:///images/Number-1-icon.png" + onClicked: { + phoneNumbertxt.text += "1"; + communicatorApp.PlaySound("cell-phone-1-nr0.wav"); + } + } + ImageButton { + leftMargin: leftMarginVal + defaultImageSource: "asset:///images/Number-2-icon.png" + onClicked: { + phoneNumbertxt.text += "2"; + communicatorApp.PlaySound("cell-phone-1-nr0.wav"); + } + } + ImageButton { + leftMargin: leftMarginVal + defaultImageSource: "asset:///images/Number-3-icon.png" + onClicked: { + phoneNumbertxt.text += "3"; + communicatorApp.PlaySound("cell-phone-1-nr0.wav"); + } + } + } + Container { + topMargin: topMarginVal + layout: StackLayout { + orientation: LayoutOrientation.LeftToRight + } + horizontalAlignment: HorizontalAlignment.Center + verticalAlignment: VerticalAlignment.Center + ImageButton { + defaultImageSource: "asset:///images/Number-4-icon.png" + onClicked: { + phoneNumbertxt.text += "4"; + communicatorApp.PlaySound("cell-phone-1-nr0.wav"); + } + } + ImageButton { + leftMargin: leftMarginVal + defaultImageSource: "asset:///images/Number-5-icon.png" + onClicked: { + phoneNumbertxt.text += "5"; + communicatorApp.PlaySound("cell-phone-1-nr0.wav"); + } + } + ImageButton { + leftMargin: leftMarginVal + defaultImageSource: "asset:///images/Number-6-icon.png" + onClicked: { + phoneNumbertxt.text += "6"; + communicatorApp.PlaySound("cell-phone-1-nr0.wav"); + } + } + } + Container { + topMargin: topMarginVal + layout: StackLayout { + orientation: LayoutOrientation.LeftToRight + } + horizontalAlignment: HorizontalAlignment.Center + verticalAlignment: VerticalAlignment.Center + ImageButton { + defaultImageSource: "asset:///images/Number-7-icon.png" + onClicked: { + phoneNumbertxt.text += "7"; + communicatorApp.PlaySound("cell-phone-1-nr0.wav"); + } + } + ImageButton { + leftMargin: leftMarginVal + defaultImageSource: "asset:///images/Number-8-icon.png" + onClicked: { + phoneNumbertxt.text += "8"; + communicatorApp.PlaySound("cell-phone-1-nr0.wav"); + } + } + ImageButton { + leftMargin: leftMarginVal + defaultImageSource: "asset:///images/Number-9-icon.png" + onClicked: { + phoneNumbertxt.text += "9"; + communicatorApp.PlaySound("cell-phone-1-nr0.wav"); + } + } + } + Container { + topMargin: topMarginVal + horizontalAlignment: HorizontalAlignment.Center + verticalAlignment: VerticalAlignment.Center + layout: StackLayout { + orientation: LayoutOrientation.LeftToRight + } + ImageButton { + defaultImageSource: "asset:///images/Math-multiply-icon.png" + onClicked: { + phoneNumbertxt.text += "*"; + communicatorApp.PlaySound("cell-phone-1-nr0.wav"); + } + } + ImageButton { + leftMargin: leftMarginVal + defaultImageSource: "asset:///images/Number-0-icon.png" + onClicked: {} + gestureHandlers: [ + LongPressHandler { + onLongPressed: { + phoneNumbertxt.text += "+"; + communicatorApp.PlaySound("cell-phone-1-nr0.wav"); + } + }, + TapHandler { + onTapped: { + phoneNumbertxt.text += "0"; + communicatorApp.PlaySound("cell-phone-1-nr0.wav"); + } + } + ] + } + ImageButton { + leftMargin: leftMarginVal + defaultImageSource: "asset:///images/Hash-icon.png" + onClicked: { + phoneNumbertxt.text += "#"; + communicatorApp.PlaySound("cell-phone-1-nr0.wav"); + } + } + } + Container { + topMargin: topMarginVal + horizontalAlignment: HorizontalAlignment.Center + verticalAlignment: VerticalAlignment.Center + layout: StackLayout { + orientation: LayoutOrientation.LeftToRight + } + Container { + verticalAlignment: VerticalAlignment.Fill + horizontalAlignment: HorizontalAlignment.Fill + leftPadding: 0 + background: Color.Transparent + layout: StackLayout { + orientation: LayoutOrientation.LeftToRight + } + ImageButton { + defaultImageSource: "asset:///images/phone81.png" + onClicked: { + if(phoneNumbertxt.text.length > 0){ + Qt.phone.initiateCall(phoneNumbertxt.text); + } + } + } + Label { + id: callLab + text: "Call" + verticalAlignment: VerticalAlignment.Center + textStyle.base: SystemDefaults.TextStyles.BigText + textStyle.color: Color.White + + onTouch: { + if (event.touchType == TouchType.Down) { + callLab.textStyle.color = Color.Red + if(phoneNumbertxt.text.length > 0){ + Qt.phone.initiateCellularCall(phoneNumbertxt.text); + } + } + if (event.touchType == TouchType.Up) { + callLab.textStyle.color = Color.White + } + } + } + } + ImageButton { + leftMargin: callBtnLeftMarginVal + defaultImageSource: "asset:///images/Math-lower-than-icon.png" + gestureHandlers: [ + TapHandler { + onTapped: { + var str = phoneNumbertxt.text + str = str.substring(0, str.length - 1) + phoneNumbertxt.text = str; + } + }, + LongPressHandler { + onLongPressed: { + phoneNumbertxt.text = ""; + } + } + ] + } + } + } +} diff --git a/communicator/assets/CustomSMSComposer.qml b/communicator/assets/CustomSMSComposer.qml new file mode 100644 index 0000000..3207a87 --- /dev/null +++ b/communicator/assets/CustomSMSComposer.qml @@ -0,0 +1,63 @@ +/* Copyright (c) 2013 BlackBerry Limited. + * + * Licensed 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 bb.cascades 1.2 + +Sheet { + id: customSMSSheet + function syncPhoneNumber(toPhoneNumber) { + toLabel.text = toPhoneNumber + } + Page { + titleBar: TitleBar { + acceptAction: ActionItem { + id: sendBtn + title: "send" + enabled: false + onTriggered: { + communicatorApp.SendSMSMessage(toLabel.text,userSMSBody.text) + customSMSSheet.close(); + customSMSSheet.destroy(); + } + } + dismissAction: ActionItem { + title: "Cancel" + onTriggered: { + customSMSSheet.close() + customSMSSheet.destroy(); + } + } + visibility: ChromeVisibility.Visible + title: "Compose" + } + Container { + Label { + id: toLabel + } + Divider { } + TextArea { + id: userSMSBody + backgroundVisible: false + inputMode: TextAreaInputMode.Chat + onTextChanging: { + if(userSMSBody.text.length >0){ + sendBtn.enabled = true + } else { + sendBtn.enabled = false + } + } + } + } + } +} \ No newline at end of file diff --git a/communicator/assets/audio/wav/cell-phone-1-nr0.wav b/communicator/assets/audio/wav/cell-phone-1-nr0.wav new file mode 100644 index 0000000..aef0245 Binary files /dev/null and b/communicator/assets/audio/wav/cell-phone-1-nr0.wav differ diff --git a/communicator/assets/images/031.Chat.png b/communicator/assets/images/031.Chat.png new file mode 100644 index 0000000..f5a9479 Binary files /dev/null and b/communicator/assets/images/031.Chat.png differ diff --git a/communicator/assets/images/CallsLog.png b/communicator/assets/images/CallsLog.png new file mode 100644 index 0000000..4ae0838 Binary files /dev/null and b/communicator/assets/images/CallsLog.png differ diff --git a/communicator/assets/images/Hash-icon.png b/communicator/assets/images/Hash-icon.png new file mode 100644 index 0000000..9c85ec7 Binary files /dev/null and b/communicator/assets/images/Hash-icon.png differ diff --git a/communicator/assets/images/Math-lower-than-icon.png b/communicator/assets/images/Math-lower-than-icon.png new file mode 100644 index 0000000..9b29fcd Binary files /dev/null and b/communicator/assets/images/Math-lower-than-icon.png differ diff --git a/communicator/assets/images/Math-multiply-icon.png b/communicator/assets/images/Math-multiply-icon.png new file mode 100644 index 0000000..91d6e03 Binary files /dev/null and b/communicator/assets/images/Math-multiply-icon.png differ diff --git a/communicator/assets/images/Number-0-icon.png b/communicator/assets/images/Number-0-icon.png new file mode 100644 index 0000000..8f3647c Binary files /dev/null and b/communicator/assets/images/Number-0-icon.png differ diff --git a/communicator/assets/images/Number-1-icon.png b/communicator/assets/images/Number-1-icon.png new file mode 100644 index 0000000..547287b Binary files /dev/null and b/communicator/assets/images/Number-1-icon.png differ diff --git a/communicator/assets/images/Number-2-icon.png b/communicator/assets/images/Number-2-icon.png new file mode 100644 index 0000000..a7c905f Binary files /dev/null and b/communicator/assets/images/Number-2-icon.png differ diff --git a/communicator/assets/images/Number-3-icon.png b/communicator/assets/images/Number-3-icon.png new file mode 100644 index 0000000..d377b91 Binary files /dev/null and b/communicator/assets/images/Number-3-icon.png differ diff --git a/communicator/assets/images/Number-4-icon.png b/communicator/assets/images/Number-4-icon.png new file mode 100644 index 0000000..ec47a0d Binary files /dev/null and b/communicator/assets/images/Number-4-icon.png differ diff --git a/communicator/assets/images/Number-5-icon.png b/communicator/assets/images/Number-5-icon.png new file mode 100644 index 0000000..7766cb4 Binary files /dev/null and b/communicator/assets/images/Number-5-icon.png differ diff --git a/communicator/assets/images/Number-6-icon.png b/communicator/assets/images/Number-6-icon.png new file mode 100644 index 0000000..b0de0c1 Binary files /dev/null and b/communicator/assets/images/Number-6-icon.png differ diff --git a/communicator/assets/images/Number-7-icon.png b/communicator/assets/images/Number-7-icon.png new file mode 100644 index 0000000..d4c2977 Binary files /dev/null and b/communicator/assets/images/Number-7-icon.png differ diff --git a/communicator/assets/images/Number-8-icon.png b/communicator/assets/images/Number-8-icon.png new file mode 100644 index 0000000..03a32d2 Binary files /dev/null and b/communicator/assets/images/Number-8-icon.png differ diff --git a/communicator/assets/images/Number-9-icon.png b/communicator/assets/images/Number-9-icon.png new file mode 100644 index 0000000..43c6e12 Binary files /dev/null and b/communicator/assets/images/Number-9-icon.png differ diff --git a/communicator/assets/images/communicatorBG2.png b/communicator/assets/images/communicatorBG2.png new file mode 100644 index 0000000..aa185c8 Binary files /dev/null and b/communicator/assets/images/communicatorBG2.png differ diff --git a/communicator/assets/images/icon_127.png b/communicator/assets/images/icon_127.png new file mode 100644 index 0000000..c61375b Binary files /dev/null and b/communicator/assets/images/icon_127.png differ diff --git a/communicator/assets/images/phone81.png b/communicator/assets/images/phone81.png new file mode 100644 index 0000000..f156609 Binary files /dev/null and b/communicator/assets/images/phone81.png differ diff --git a/communicator/assets/main.qml b/communicator/assets/main.qml new file mode 100644 index 0000000..88d5647 --- /dev/null +++ b/communicator/assets/main.qml @@ -0,0 +1,128 @@ +/* Copyright (c) 2013 BlackBerry Limited. + * + * Licensed 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 bb.cascades 1.0 +import bb.system.phone 1.0 +import bb.multimedia 1.0 +import bb.system 1.0 + +// This is the application Page with a Container as content, all UI components are children to that Container. + +Page { + actionBarVisibility: ChromeVisibility.Overlay + onCreationCompleted: { + Qt.phone = phone; + phone.callUpdated.connect(communicatorApp.onCallUpdated); + } + actions: [ + ActionItem { + title: "Log" + ActionBar.placement: ActionBarPlacement.OnBar + imageSource: "asset:///images/CallsLog.png" + onTriggered: { + phone.initiateCellularCall("") + } + }, + ActionItem { + title: "SMS" + ActionBar.placement: ActionBarPlacement.OnBar + imageSource: "asset:///images/031.Chat.png" + onTriggered: { + tSMSDialog.show() + } + }, + ActionItem { + title: "Dailpad" + ActionBar.placement: ActionBarPlacement.InOverflow + imageSource: "asset:///images/icon_127.png" + onTriggered: { + phone.requestDialpad(dialPadCtn.phoneNumber) + } + } + ] + attachedObjects: [ + Phone { + id: phone + }, + ComponentDefinition { + id: customSMSSheet + source: "CustomSMSComposer.qml" + }, + SystemDialog { + id: tSMSDialog + title: "How you want to Compose SMS" + confirmButton.label: "Invoke System Composer" + customButton.label: "In App Composer" + buttonAreaLimit:1 + onFinished: { + var x = result; + if (x == SystemUiResult.ConfirmButtonSelection) { + communicatorApp.InvokeSmsComposer(dialPadCtn.phoneNumber) + } else if (x == SystemUiResult.CustomButtonSelection) { + var sheet = customSMSSheet.createObject() + sheet.syncPhoneNumber(dialPadCtn.phoneNumber) + sheet.open(); + } + } + } + ] + ScrollView { + Container { + verticalAlignment: VerticalAlignment.Fill + horizontalAlignment: HorizontalAlignment.Fill + layout: DockLayout {} + background: Color.Black + ImageView { + horizontalAlignment: HorizontalAlignment.Fill + verticalAlignment: VerticalAlignment.Fill + imageSource: "asset:///images/communicatorBG2.png" + } + Container { + CustomDialpadView { + id: dialPadCtn + topPadding: 70 + //Custom Properties + topMarginVal: 40 + leftMarginVal: 100 + callBtnLeftMarginVal: 140 + } + Container { + verticalAlignment: VerticalAlignment.Fill + horizontalAlignment: HorizontalAlignment.Fill + leftPadding: 70 + Divider { } + Label { + //horizontalAlignment: HorizontalAlignment.Center + text: "Call Updated Log:" + textStyle.base: SystemDefaults.TextStyles.SubtitleText + textStyle.color: Color.White + textStyle.textAlign: TextAlign.Left + } + TextArea { + topPadding: 0 + objectName: "CallInfoTxt" + hintText: "" + backgroundVisible: false; + text: "" + scrollMode: TextAreaScrollMode.Elastic + textStyle.base: SystemDefaults.TextStyles.SmallText + textStyle.color: Color.White + focusPolicy: FocusPolicy.None + editable: false + } + } + } + } + } +} diff --git a/communicator/bar-descriptor.xml b/communicator/bar-descriptor.xml new file mode 100644 index 0000000..3942e13 --- /dev/null +++ b/communicator/bar-descriptor.xml @@ -0,0 +1,108 @@ + + + + + + + + com.bb10example.phone.communicator + + + Communicator + + + 1.0.0 + + + 1 + + + + + + The communicator application + + + + + + RIM + + + armle-v7 + communicator + + + Qnx/Cascades + armle-v7 + communicator.so + + + armle-v7 + communicator + + + x86 + communicator + + + + + + + portrait + false + none + false + + + + + + + + + + icon.png + + + + + + assets + icon.png + + + run_native + access_sms_mms + access_phone + access_shared + + + diff --git a/communicator/communicator.pro b/communicator/communicator.pro new file mode 100644 index 0000000..d2fb982 --- /dev/null +++ b/communicator/communicator.pro @@ -0,0 +1,10 @@ +APP_NAME = communicator + +CONFIG += qt warn_on cascades10 + +include(config.pri) +LIBS += -lbb +LIBS += -lbbsystem +LIBS += -lbbdata +LIBS += -lOpenAL -lalut -lasound +LIBS += -lbbpim \ No newline at end of file diff --git a/communicator/config.pri b/communicator/config.pri new file mode 100644 index 0000000..c06642a --- /dev/null +++ b/communicator/config.pri @@ -0,0 +1,70 @@ +# Auto-generated by IDE. Any changes made by user will be lost! +BASEDIR = $$quote($$_PRO_FILE_PWD_) + +device { + CONFIG(debug, debug|release) { + SOURCES += $$quote($$BASEDIR/src/applicationui.cpp) \ + $$quote($$BASEDIR/src/main.cpp) \ + $$quote($$BASEDIR/src/soundmanager.cpp) + + HEADERS += $$quote($$BASEDIR/src/applicationui.hpp) \ + $$quote($$BASEDIR/src/soundmanager.h) + } + + CONFIG(release, debug|release) { + SOURCES += $$quote($$BASEDIR/src/applicationui.cpp) \ + $$quote($$BASEDIR/src/main.cpp) \ + $$quote($$BASEDIR/src/soundmanager.cpp) + + HEADERS += $$quote($$BASEDIR/src/applicationui.hpp) \ + $$quote($$BASEDIR/src/soundmanager.h) + } +} + +simulator { + CONFIG(debug, debug|release) { + SOURCES += $$quote($$BASEDIR/src/applicationui.cpp) \ + $$quote($$BASEDIR/src/main.cpp) \ + $$quote($$BASEDIR/src/soundmanager.cpp) + + HEADERS += $$quote($$BASEDIR/src/applicationui.hpp) \ + $$quote($$BASEDIR/src/soundmanager.h) + } +} + +INCLUDEPATH += $$quote($$BASEDIR/src) + +CONFIG += precompile_header + +PRECOMPILED_HEADER = $$quote($$BASEDIR/precompiled.h) + +lupdate_inclusion { + SOURCES += $$quote($$BASEDIR/../src/*.c) \ + $$quote($$BASEDIR/../src/*.c++) \ + $$quote($$BASEDIR/../src/*.cc) \ + $$quote($$BASEDIR/../src/*.cpp) \ + $$quote($$BASEDIR/../src/*.cxx) \ + $$quote($$BASEDIR/../assets/*.qml) \ + $$quote($$BASEDIR/../assets/*.js) \ + $$quote($$BASEDIR/../assets/*.qs) \ + $$quote($$BASEDIR/../assets/720x720/*.qml) \ + $$quote($$BASEDIR/../assets/720x720/*.js) \ + $$quote($$BASEDIR/../assets/720x720/*.qs) \ + $$quote($$BASEDIR/../assets/audio/*.qml) \ + $$quote($$BASEDIR/../assets/audio/*.js) \ + $$quote($$BASEDIR/../assets/audio/*.qs) \ + $$quote($$BASEDIR/../assets/audio/wav/*.qml) \ + $$quote($$BASEDIR/../assets/audio/wav/*.js) \ + $$quote($$BASEDIR/../assets/audio/wav/*.qs) \ + $$quote($$BASEDIR/../assets/images/*.qml) \ + $$quote($$BASEDIR/../assets/images/*.js) \ + $$quote($$BASEDIR/../assets/images/*.qs) + + HEADERS += $$quote($$BASEDIR/../src/*.h) \ + $$quote($$BASEDIR/../src/*.h++) \ + $$quote($$BASEDIR/../src/*.hh) \ + $$quote($$BASEDIR/../src/*.hpp) \ + $$quote($$BASEDIR/../src/*.hxx) +} + +TRANSLATIONS = $$quote($${TARGET}.ts) diff --git a/communicator/icon.png b/communicator/icon.png new file mode 100644 index 0000000..5387fa8 Binary files /dev/null and b/communicator/icon.png differ diff --git a/communicator/precompiled.h b/communicator/precompiled.h new file mode 100644 index 0000000..6213dc4 --- /dev/null +++ b/communicator/precompiled.h @@ -0,0 +1,2 @@ +// This file is used to store precompiled headers. +// It is intentionally left blank. It is up to you to decide which headers should be included here. diff --git a/communicator/src/applicationui.cpp b/communicator/src/applicationui.cpp new file mode 100644 index 0000000..287baca --- /dev/null +++ b/communicator/src/applicationui.cpp @@ -0,0 +1,204 @@ +/* Copyright (c) 2013 BlackBerry Limited. + * + * Licensed 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 "applicationui.hpp" + +#include "soundmanager.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace bb::cascades; +using namespace bb::data; +using namespace bb::system; +using namespace bb::pim::account; +using namespace bb::pim::message; +using namespace bb::system::phone; + +ApplicationUI::ApplicationUI(bb::cascades::Application *app) : + QObject(app) { + // prepare the localization + m_pTranslator = new QTranslator(this); + m_pLocaleHandler = new LocaleHandler(this); + if (!QObject::connect(m_pLocaleHandler, SIGNAL(systemLanguageChanged()), + this, SLOT(onSystemLanguageChanged()))) { + // This is an abnormal situation! Something went wrong! + // Add own code to recover here + qWarning() << "Recovering from a failed connect()"; + } + // initial load + onSystemLanguageChanged(); + + qmlRegisterType("bb.system.phone", 1, 0, "Phone"); + DataSource::registerQmlTypes(); + + // Create scene document from main.qml asset, the parent is set + // to ensure the document gets destroyed properly at shut down. + QmlDocument *qml = QmlDocument::create("asset:///main.qml").parent(this); + + //Sharing Object With QML + qml->setContextProperty("communicatorApp", this); + + //SoundManager Initialization + mSoundManager = new SoundManager("audio/wav/"); + + // Create root object for the UI + AbstractPane *root = qml->createRootObject(); + + //get Reference to the Call Info Text Area in Main.qml + m_CallInfoTxtArea = root->findChild(QString("CallInfoTxt")); + //get Reference to the Phone Number Text Field in Main.qml + m_PhoneNumberTxtField = root->findChild( + QString("phoneNumbertxt")); + + // Set created root object as the application scene + app->setScene(root); +} + +void ApplicationUI::onSystemLanguageChanged() { + QCoreApplication::instance()->removeTranslator(m_pTranslator); + // Initiate, load and install the application translation files. + QString locale_string = QLocale().name(); + QString file_name = QString("communicator_%1").arg(locale_string); + if (m_pTranslator->load(file_name, "app/native/qm")) { + QCoreApplication::instance()->installTranslator(m_pTranslator); + } +} + +void ApplicationUI::InvokeSmsComposer(QString PhoneNumber) { + InvokeRequest cardrequest; + cardrequest.setTarget("sys.pim.text_messaging.composer"); + cardrequest.setAction("bb.action.SENDTEXT"); + cardrequest.setUri("tel:" + PhoneNumber); + InvokeManager invokemanager; + InvokeTargetReply *reply = invokemanager.invoke(cardrequest); + if (reply) { + connect(reply, SIGNAL(finished()), this, SLOT(OnInvokeFinished())); + } else { + qDebug() << "Invocation Connecting Failed!!"; + } +} + +void ApplicationUI::OnInvokeFinished() { + InvokeTargetReply *reply = qobject_cast(sender()); + if (reply->error()) { + qDebug() << "Invoke Failed - Do something"; + } + reply->deleteLater(); +} + +void ApplicationUI::PlaySound(const QString &msg) { + // Play sound determined by QString parameter + mSoundManager->play(msg); +} + +void ApplicationUI::SendSMSMessage(QString ToStr, QString BodyStr) { + + MessageService messageService; + AccountService accountService; + + //Get the SMS/MMS account + QList accountList = accountService.accounts(Service::Messages, + "sms-mms"); + AccountKey accountId = accountList.first().id(); + + //Create a conversation because sms/mms chats most of the time is a conversation + ConversationBuilder* conversationBuilder = ConversationBuilder::create(); + conversationBuilder->accountId(accountId); + + // Create a contact to whom you want to send sms/mms. + int contactKey = -1; + MessageContact recipient = MessageContact(contactKey, MessageContact::To, + ToStr, ToStr); + QList participants; + participants.append(recipient); + + //Add the contact to the conversation + conversationBuilder->participants(participants); + Conversation conversation = *conversationBuilder; + ConversationKey conversationId = messageService.save(accountId, + conversation); + + //Create a message Builder for sms/mms + MessageBuilder* messageBuilder = MessageBuilder::create(accountId); + messageBuilder->conversationId(conversationId); + messageBuilder->addRecipient(recipient); + messageBuilder->addAttachment( + Attachment("text/plain", "body.txt", BodyStr)); + Message message; + message = *messageBuilder; + + //Sending SMS/MMS + messageService.send(accountId, message); + ShowToast("SMS sent successfully"); +} + +void ApplicationUI::ShowToast(QString Msg) { + using namespace bb::system; + + SystemToast *toast = new SystemToast(this); + + toast->setBody(Msg); + toast->show(); +} + +void ApplicationUI::onCallUpdated(const Call &call) { + QMetaObject MetaCallTypeObject = CallType::staticMetaObject; + QMetaEnum CallTypeEnum = MetaCallTypeObject.enumerator( + MetaCallTypeObject.indexOfEnumerator("Type")); + + QMetaObject MetaCallStateObject = CallState::staticMetaObject; + QMetaEnum CallStateEnum = MetaCallStateObject.enumerator( + MetaCallStateObject.indexOfEnumerator("Type")); + + CallType::Type CurrentCallType = call.callType(); + CallState::Type CurrentCallState = call.callState(); + + //qDebug() << "Call ID : " << call.callId(); + //qDebug() << "Call Type : " << CallTypeEnum.valueToKey(CurrentCallType); + //qDebug() << "Call State : " << CallStateEnum.valueToKey(CurrentCallState); + + if (m_CallInfoTxtArea) { //Check the reference is not NULL + //Update the GUI + QString CallStatusStr = m_CallInfoTxtArea->text(); + CallStatusStr = CallStatusStr + "Call [ID:" + QString::number(call.callId()); + if(m_PhoneNumberTxtField){ + CallStatusStr = CallStatusStr + ",Number:" + m_PhoneNumberTxtField->text(); + } + CallStatusStr = CallStatusStr + ",Type:" + CallTypeEnum.valueToKey(CurrentCallType); + CallStatusStr = CallStatusStr + ",State:" + CallStateEnum.valueToKey(CurrentCallState) + "]\n"; + + qDebug() << "Call Details : " << CallStatusStr; + + m_CallInfoTxtArea->setText(CallStatusStr); + } +} diff --git a/communicator/src/applicationui.hpp b/communicator/src/applicationui.hpp new file mode 100644 index 0000000..535ab68 --- /dev/null +++ b/communicator/src/applicationui.hpp @@ -0,0 +1,70 @@ +/* Copyright (c) 2013 BlackBerry Limited. + * + * Licensed 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 ApplicationUI_HPP_ +#define ApplicationUI_HPP_ + +#include "soundmanager.h" +#include +#include +#include +#include +#include + +using namespace bb::cascades; +namespace bb +{ + namespace cascades + { + class Application; + class LocaleHandler; + } +} + +class QTranslator; + +/*! + * @brief Application object + * + * + */ + +class ApplicationUI : public QObject +{ + Q_OBJECT +public: + ApplicationUI(bb::cascades::Application *app); + virtual ~ApplicationUI() { } + Q_INVOKABLE void InvokeSmsComposer(QString PhoneNumber); + Q_INVOKABLE void SendSMSMessage(QString To, QString BodyStr); + Q_INVOKABLE void PlaySound(const QString &msg); + +private slots: + void onSystemLanguageChanged(); + void OnInvokeFinished(); + +public slots: + void onCallUpdated(const bb::system::phone::Call &call); + +private: + void ShowToast(QString BodyStr); + QTranslator* m_pTranslator; + LocaleHandler* m_pLocaleHandler; + SoundManager *mSoundManager; + TextArea *m_CallInfoTxtArea; + TextField *m_PhoneNumberTxtField; +}; + +#endif /* ApplicationUI_HPP_ */ diff --git a/communicator/src/main.cpp b/communicator/src/main.cpp new file mode 100644 index 0000000..ef80951 --- /dev/null +++ b/communicator/src/main.cpp @@ -0,0 +1,35 @@ +/* Copyright (c) 2013 BlackBerry Limited. + * + * Licensed 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 + +#include +#include +#include "applicationui.hpp" + +#include + +using namespace bb::cascades; + +Q_DECL_EXPORT int main(int argc, char **argv) +{ + Application app(argc, argv); + + // Create the Application UI object, this is where the main.qml file + // is loaded and the application scene is set. + new ApplicationUI(&app); + + // Enter the application main event loop. + return Application::exec(); +} diff --git a/communicator/src/soundmanager.cpp b/communicator/src/soundmanager.cpp new file mode 100644 index 0000000..472a409 --- /dev/null +++ b/communicator/src/soundmanager.cpp @@ -0,0 +1,197 @@ +/* Copyright (c) 2013 BlackBerry Limited. + * + * Licensed 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 "soundmanager.h" + +#include +#include +#include +#include +#include + +// Error message function for ALUT. +static void reportALUTError() +{ + qDebug() << "ALUT reported the following error: " << alutGetErrorString(alutGetError()); +} + +// Error message function for OpenAL. +static void reportOpenALError() +{ + qDebug() << "OpenAL reported the following error: \n" << alutGetErrorString(alGetError()); +} + +SoundManager::SoundManager(QString soundDirectory) +{ + QString applicationDirectory; + QString completeSoundDirectory; + char cwd[PATH_MAX]; + ALuint bufferID; + + // Initialize the ALUT. + if (alutInit(NULL, NULL) == false) { + reportALUTError(); + } + + // First, we get the complete application directory in which we will load sounds from then + // we convert to QString since it is more convenient when working with directories. + getcwd(cwd, PATH_MAX); + applicationDirectory = QString(cwd); + + // Append the assets directory and the actual sounds directory name. + completeSoundDirectory = applicationDirectory.append("/app/native/assets/").append( + soundDirectory); + + // Create OpenAL buffers from all files in the sound directory. + QDir dir(completeSoundDirectory); + + if (!dir.exists()) { + qDebug() << "Cannot find the sounds directory." << completeSoundDirectory; + } else { + + // Set a filter for file listing, only files should be listed. + dir.setFilter(QDir::Files | QDir::NoSymLinks | QDir::NoDotAndDotDot); + + // Get a directory listing. + QFileInfoList list = dir.entryInfoList(); + + // Traverse all the files. + for (int i = 0; i < list.size(); ++i) { + + // Attempt to create a buffer for each file. + QFileInfo fileInfo = list.at(i); + bufferID = alutCreateBufferFromFile(fileInfo.absoluteFilePath().toStdString().c_str()); + + if (alutGetError() == ALUT_ERROR_NO_ERROR) { + + // If successful on buffer creation, add the bufferID to the Hash table + // with the file name as key. + mSoundBuffers[fileInfo.fileName()] = bufferID; + + } else { + reportALUTError(); + } + } + } + + // Generate a number of sources used to attach buffers and play. + alGenSources(SOUNDMANAGER_MAX_NBR_OF_SOURCES, mSoundSources); + + if (alGetError() != AL_NO_ERROR) { + reportOpenALError(); + } +} + +SoundManager::~SoundManager() +{ + ALuint bufferID = 0; + + // Clear all the sources. + for (int sourceIndex = 0; sourceIndex < SOUNDMANAGER_MAX_NBR_OF_SOURCES; sourceIndex++) { + ALuint source = mSoundSources[sourceIndex]; + alDeleteSources(1, &source); + + if (alGetError() != AL_NO_ERROR) { + reportOpenALError(); + } + } + + // Clear the buffers and iterate through the hash table. + QHashIterator iterator(mSoundBuffers); + + while (iterator.hasNext()) { + iterator.next(); + + // Get the buffer id and delete it. + bufferID = mSoundBuffers[iterator.key()]; + if (bufferID != 0) { + alDeleteBuffers(1, &bufferID); + + if (alGetError() != AL_NO_ERROR) { + reportOpenALError(); + } + } + } + + // Clear the QHash for sound buffer IDs. + mSoundBuffers.clear(); + + // Exit the ALUT. + if (alutExit() == false) { + reportALUTError(); + } +} + +bool SoundManager::play(QString fileName, float pitch, float gain) +{ + static uint sourceIndex = 0; + + // Get the corresponding buffer ID to the file name. + ALuint bufferID = mSoundBuffers[fileName]; + + if (bufferID != 0) { + // Increment which source we are using, so that we play in an unused source. + sourceIndex = (sourceIndex + 1) % SOUNDMANAGER_MAX_NBR_OF_SOURCES; + + // Get the source from which the sound will be played. + ALuint source = mSoundSources[sourceIndex]; + + if (alIsSource(source) == AL_TRUE) { + + // Attach the buffer the available source. + alSourcei(source, AL_BUFFER, bufferID); + + if (alGetError() != AL_NO_ERROR) { + reportOpenALError(); + return false; + } + + // Set the source pitch value. + alSourcef(source, AL_PITCH, pitch); + + if (alGetError() != AL_NO_ERROR) { + reportOpenALError(); + return false; + } + + // Set the source gain value. + alSourcef(source, AL_GAIN, gain); + + if (alGetError() != AL_NO_ERROR) { + reportOpenALError(); + return false; + } + + // Play the source. + alSourcePlay(source); + + if (alGetError() != AL_NO_ERROR) { + reportOpenALError(); + return false; + } + } + } else { + // Otherwise, the buffer was not found. + return false; + } + + return true; +} + +bool SoundManager::play(QString fileName) +{ + // Play the sound with default gain and pitch values. + return play(fileName, 1.0f, 1.0f); +} diff --git a/communicator/src/soundmanager.h b/communicator/src/soundmanager.h new file mode 100644 index 0000000..aaf78cc --- /dev/null +++ b/communicator/src/soundmanager.h @@ -0,0 +1,84 @@ +/* Copyright (c) 2013 BlackBerry Limited. + * + * Licensed 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 _SOUNDMANAGER_H +#define _SOUNDMANAGER_H + +#include +#include +#include + +#include +#include + +// The number of max number of sound sources +#define SOUNDMANAGER_MAX_NBR_OF_SOURCES 32 + +/** + * SoundManager Description: + * + * A very basic sound manager class for playing sounds using OpenAL library. + */ +class SoundManager +{ +public: + + /** + * This is our constructor which initializes the sound manager. This function sets up OpenAL + * and loads all sounds from the specified directory. This directory should + * be a folder only containing valid sounds. + * + * @param soundDirectory Directory where all sounds are kept (have to be located in the assets/ folder) + */ + SoundManager(QString soundDirectory); + + /** + * This is our destructor which destroys all buffers and sources. + */ + ~SoundManager(); + + /** + * This function is called by the constructor and it loads all sounds from the specified directory. + * + * @param soundDirectory Directory where all sounds are kept (have to be located in the assets/ folder) + */ + bool init(QString soundDirectory); + + /** + * Plays a sound. + * + * @param fileName The name of the file in the soundDirectory. + */ + bool play(QString fileName); + + /** + * Plays a sound, with modified pitch and gain. + * + * @param fileName The name of the file in the soundDirectory + * @param pitch Specifies the pitch to be applied to a sound Range: [0.5-2.0] + * @param gain Sound gain (volume amplification) Range: ]0.0- ] + */ + bool play(QString fileName, float pitch, float gain); + +private: + + // Sound buffers + QHash mSoundBuffers; + + // Sound sources + ALuint mSoundSources[SOUNDMANAGER_MAX_NBR_OF_SOURCES]; +}; + +#endif //_SOUNDMANAGER_H diff --git a/communicator/translations/Makefile b/communicator/translations/Makefile new file mode 100644 index 0000000..ce9c2c9 --- /dev/null +++ b/communicator/translations/Makefile @@ -0,0 +1,12 @@ +QMAKE_TARGET = communicator +LUPDATE = $(QNX_HOST)/usr/bin/lupdate +LRELEASE = $(QNX_HOST)/usr/bin/lrelease + +update: $(QMAKE_TARGET).pro FORCE + $(LUPDATE) $(QMAKE_TARGET).pro + +release: $(QMAKE_TARGET).pro $(QMAKE_TARGET).ts + $(LRELEASE) $(QMAKE_TARGET).pro + +FORCE: + diff --git a/communicator/translations/communicator.pro b/communicator/translations/communicator.pro new file mode 100644 index 0000000..1069178 --- /dev/null +++ b/communicator/translations/communicator.pro @@ -0,0 +1 @@ +include (../communicator.pro) diff --git a/communicator/translations/communicator.ts b/communicator/translations/communicator.ts new file mode 100644 index 0000000..07a7469 --- /dev/null +++ b/communicator/translations/communicator.ts @@ -0,0 +1,4 @@ + + + +