From d6c3cfd9ffc853fd8aac261070ef49685b06c42d Mon Sep 17 00:00:00 2001 From: JongTae Date: Fri, 8 Nov 2013 13:53:14 +0900 Subject: [PATCH] Applied latest source code Change-Id: Ia8d57ee5f58cb084a6297efc8d825189dbedc2ad --- CMakeLists.txt | 5 + Installer/.cproject | 446 ++++++++++++++++++ Installer/.project | 100 ++++ Installer/CMakeLists.txt | 30 ++ Installer/inc/AppResourceId.h | 70 +++ Installer/inc/IstDetailForm.h | 76 +++ Installer/inc/IstFormFactory.h | 38 ++ Installer/inc/IstInstalledPopup.h | 55 +++ Installer/inc/IstInstallerApp.h | 54 +++ Installer/inc/IstMainFrame.h | 45 ++ Installer/manifest.xml | 38 ++ Installer/res/.workflow | Bin 0 -> 5321 bytes Installer/res/ara-AE.xml | 25 + Installer/res/aze-AZ.xml | 25 + Installer/res/bul-BG.xml | 25 + Installer/res/cat-ES.xml | 25 + Installer/res/ces-CZ.xml | 25 + Installer/res/dan-DK.xml | 25 + Installer/res/deu-DE.xml | 25 + Installer/res/ell-GR.xml | 25 + Installer/res/eng-GB.xml | 25 + Installer/res/eng-PH.xml | 25 + Installer/res/eng-US.xml | 25 + Installer/res/est-EE.xml | 25 + Installer/res/eus-ES.xml | 25 + Installer/res/fin-FI.xml | 25 + Installer/res/fra-CA.xml | 25 + Installer/res/fra-FR.xml | 25 + Installer/res/gle-IE.xml | 25 + Installer/res/glg-ES.xml | 25 + Installer/res/hin-IN.xml | 25 + Installer/res/hrv-HR.xml | 25 + Installer/res/hun-HU.xml | 25 + Installer/res/hye-AM.xml | 25 + Installer/res/isl-IS.xml | 25 + Installer/res/ita-IT.xml | 25 + Installer/res/jpn-JP.xml | 25 + Installer/res/kat-GE.xml | 25 + Installer/res/kaz-KZ.xml | 25 + Installer/res/kor-KR.xml | 25 + Installer/res/lav-LV.xml | 25 + Installer/res/lit-LT.xml | 25 + Installer/res/mkd-MK.xml | 25 + Installer/res/nld-NL.xml | 25 + Installer/res/nob-NO.xml | 25 + Installer/res/pol-PL.xml | 25 + Installer/res/por-BR.xml | 25 + Installer/res/por-PT.xml | 25 + Installer/res/ron-RO.xml | 25 + Installer/res/rus-RU.xml | 25 + .../00_button_expand_closed.png | Bin 0 -> 3280 bytes .../00_button_expand_opened.png | Bin 0 -> 3276 bytes .../res/screen-size-normal/IDL_DETAIL_FORM.xml | 23 + .../res/screen-size-normal/IDL_INSTALLED_POPUP.xml | 43 ++ .../IDL_PANEL_BACKGROUND_BUTTON_ITEM.xml | 18 + .../IDL_PANEL_EXPANDABLE_ITEM.xml | 28 ++ Installer/res/screen-size-normal/workflow.xml | 9 + Installer/res/slk-SK.xml | 25 + Installer/res/slv-SI.xml | 25 + Installer/res/spa-ES.xml | 25 + Installer/res/spa-MX.xml | 25 + Installer/res/srp-RS.xml | 25 + Installer/res/swe-SE.xml | 25 + Installer/res/tur-TR.xml | 25 + Installer/res/ukr-UA.xml | 25 + Installer/res/uzb-UZ.xml | 25 + Installer/res/zho-CN.xml | 25 + Installer/res/zho-HK.xml | 25 + Installer/res/zho-SG.xml | 25 + Installer/res/zho-TW.xml | 25 + Installer/shared/data/nofile.dummy | 0 .../shared/res/screen-density-xhigh/mainmenu.png | Bin 0 -> 57662 bytes Installer/shared/trusted/nofile.dummy | 0 Installer/src/AppResourceId.cpp | 60 +++ Installer/src/InstallerEntry.cpp | 50 ++ Installer/src/IstDetailForm.cpp | 522 +++++++++++++++++++++ Installer/src/IstFormFactory.cpp | 55 +++ Installer/src/IstInstalledPopup.cpp | 170 +++++++ Installer/src/IstInstallerApp.cpp | 123 +++++ Installer/src/IstMainFrame.cpp | 129 +++++ InstallerService/.cproject | 450 ++++++++++++++++++ InstallerService/.project | 99 ++++ InstallerService/CMakeLists.txt | 29 ++ InstallerService/inc/AppResourceId.h | 32 ++ InstallerService/inc/InstallerService.h | 64 +++ InstallerService/manifest.xml | 31 ++ .../screen-size-normal/IDL_QUICK_INSTALLATION.xml | 37 ++ .../shared/res/screen-density-xhigh/mainmenu.png | Bin 0 -> 57662 bytes InstallerService/src/AppResourceId.cpp | 29 ++ InstallerService/src/InstallerService.cpp | 330 +++++++++++++ InstallerService/src/InstallerServiceEntry.cpp | 50 ++ LICENSE.Flora | 206 ++++++++ NOTICE | 3 + manifest.xml | 47 ++ packaging/apps.Installer.changes | 7 + packaging/apps.Installer.spec | 65 +++ 96 files changed, 4941 insertions(+) create mode 100755 CMakeLists.txt create mode 100644 Installer/.cproject create mode 100644 Installer/.project create mode 100644 Installer/CMakeLists.txt create mode 100644 Installer/inc/AppResourceId.h create mode 100644 Installer/inc/IstDetailForm.h create mode 100644 Installer/inc/IstFormFactory.h create mode 100644 Installer/inc/IstInstalledPopup.h create mode 100644 Installer/inc/IstInstallerApp.h create mode 100644 Installer/inc/IstMainFrame.h create mode 100644 Installer/manifest.xml create mode 100644 Installer/res/.workflow create mode 100644 Installer/res/ara-AE.xml create mode 100644 Installer/res/aze-AZ.xml create mode 100644 Installer/res/bul-BG.xml create mode 100644 Installer/res/cat-ES.xml create mode 100644 Installer/res/ces-CZ.xml create mode 100644 Installer/res/dan-DK.xml create mode 100644 Installer/res/deu-DE.xml create mode 100644 Installer/res/ell-GR.xml create mode 100644 Installer/res/eng-GB.xml create mode 100644 Installer/res/eng-PH.xml create mode 100644 Installer/res/eng-US.xml create mode 100644 Installer/res/est-EE.xml create mode 100644 Installer/res/eus-ES.xml create mode 100644 Installer/res/fin-FI.xml create mode 100644 Installer/res/fra-CA.xml create mode 100644 Installer/res/fra-FR.xml create mode 100644 Installer/res/gle-IE.xml create mode 100644 Installer/res/glg-ES.xml create mode 100644 Installer/res/hin-IN.xml create mode 100644 Installer/res/hrv-HR.xml create mode 100644 Installer/res/hun-HU.xml create mode 100644 Installer/res/hye-AM.xml create mode 100644 Installer/res/isl-IS.xml create mode 100644 Installer/res/ita-IT.xml create mode 100644 Installer/res/jpn-JP.xml create mode 100644 Installer/res/kat-GE.xml create mode 100644 Installer/res/kaz-KZ.xml create mode 100644 Installer/res/kor-KR.xml create mode 100644 Installer/res/lav-LV.xml create mode 100644 Installer/res/lit-LT.xml create mode 100644 Installer/res/mkd-MK.xml create mode 100644 Installer/res/nld-NL.xml create mode 100644 Installer/res/nob-NO.xml create mode 100644 Installer/res/pol-PL.xml create mode 100644 Installer/res/por-BR.xml create mode 100644 Installer/res/por-PT.xml create mode 100644 Installer/res/ron-RO.xml create mode 100644 Installer/res/rus-RU.xml create mode 100644 Installer/res/screen-density-xhigh/00_button_expand_closed.png create mode 100644 Installer/res/screen-density-xhigh/00_button_expand_opened.png create mode 100644 Installer/res/screen-size-normal/IDL_DETAIL_FORM.xml create mode 100644 Installer/res/screen-size-normal/IDL_INSTALLED_POPUP.xml create mode 100644 Installer/res/screen-size-normal/IDL_PANEL_BACKGROUND_BUTTON_ITEM.xml create mode 100644 Installer/res/screen-size-normal/IDL_PANEL_EXPANDABLE_ITEM.xml create mode 100644 Installer/res/screen-size-normal/workflow.xml create mode 100644 Installer/res/slk-SK.xml create mode 100644 Installer/res/slv-SI.xml create mode 100644 Installer/res/spa-ES.xml create mode 100644 Installer/res/spa-MX.xml create mode 100644 Installer/res/srp-RS.xml create mode 100644 Installer/res/swe-SE.xml create mode 100644 Installer/res/tur-TR.xml create mode 100644 Installer/res/ukr-UA.xml create mode 100644 Installer/res/uzb-UZ.xml create mode 100644 Installer/res/zho-CN.xml create mode 100644 Installer/res/zho-HK.xml create mode 100644 Installer/res/zho-SG.xml create mode 100644 Installer/res/zho-TW.xml create mode 100644 Installer/shared/data/nofile.dummy create mode 100644 Installer/shared/res/screen-density-xhigh/mainmenu.png create mode 100644 Installer/shared/trusted/nofile.dummy create mode 100644 Installer/src/AppResourceId.cpp create mode 100644 Installer/src/InstallerEntry.cpp create mode 100644 Installer/src/IstDetailForm.cpp create mode 100644 Installer/src/IstFormFactory.cpp create mode 100644 Installer/src/IstInstalledPopup.cpp create mode 100644 Installer/src/IstInstallerApp.cpp create mode 100644 Installer/src/IstMainFrame.cpp create mode 100644 InstallerService/.cproject create mode 100644 InstallerService/.project create mode 100644 InstallerService/CMakeLists.txt create mode 100644 InstallerService/inc/AppResourceId.h create mode 100644 InstallerService/inc/InstallerService.h create mode 100644 InstallerService/manifest.xml create mode 100644 InstallerService/res/screen-size-normal/IDL_QUICK_INSTALLATION.xml create mode 100644 InstallerService/shared/res/screen-density-xhigh/mainmenu.png create mode 100644 InstallerService/src/AppResourceId.cpp create mode 100644 InstallerService/src/InstallerService.cpp create mode 100644 InstallerService/src/InstallerServiceEntry.cpp create mode 100755 LICENSE.Flora create mode 100644 NOTICE create mode 100644 manifest.xml create mode 100644 packaging/apps.Installer.changes create mode 100755 packaging/apps.Installer.spec diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100755 index 0000000..6c2f176 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,5 @@ +PROJECT(Installer) + +ADD_SUBDIRECTORY(Installer) +ADD_SUBDIRECTORY(InstallerService) + diff --git a/Installer/.cproject b/Installer/.cproject new file mode 100644 index 0000000..d68001d --- /dev/null +++ b/Installer/.cproject @@ -0,0 +1,446 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Installer/.project b/Installer/.project new file mode 100644 index 0000000..6beb7c7 --- /dev/null +++ b/Installer/.project @@ -0,0 +1,100 @@ + + + Installer + + + InstallerService + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + ?name? + + + + org.eclipse.cdt.make.core.append_environment + true + + + org.eclipse.cdt.make.core.autoBuildTarget + all + + + org.eclipse.cdt.make.core.buildArguments + + + + org.eclipse.cdt.make.core.buildCommand + sbi-make + + + org.eclipse.cdt.make.core.buildLocation + ${workspace_loc:/$(projectName)/Debug} + + + org.eclipse.cdt.make.core.cleanBuildTarget + clean + + + org.eclipse.cdt.make.core.contents + org.eclipse.cdt.make.core.activeConfigSettings + + + org.eclipse.cdt.make.core.enableAutoBuild + true + + + org.eclipse.cdt.make.core.enableCleanBuild + true + + + org.eclipse.cdt.make.core.enableFullBuild + true + + + org.eclipse.cdt.make.core.fullBuildTarget + all + + + org.eclipse.cdt.make.core.stopOnError + true + + + org.eclipse.cdt.make.core.useDefaultBuildCmd + true + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + org.tizen.nativecpp.apichecker.core.builder + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + org.tizen.nativecpp.apichecker.core.tizenCppNature + + + + 0 + + 26 + + org.eclipse.ui.ide.multiFilter + 1.0-projectRelativePath-matches-false-false-*/.tpk + + + + diff --git a/Installer/CMakeLists.txt b/Installer/CMakeLists.txt new file mode 100644 index 0000000..01c55bd --- /dev/null +++ b/Installer/CMakeLists.txt @@ -0,0 +1,30 @@ +# Target name and AppID +SET(this_target Installer) +SET(PKG_ID D7eOJquGtL) + +# include directory +INCLUDE_DIRECTORIES( + /usr/include/osp + inc + ) + +# Source files +FILE(GLOB ${this_target}_SOURCE_FILES src/*.cpp) + +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIE") + +# Create executable +SET(CMAKE_EXECUTABLE_SUFFIX ".exe") +ADD_EXECUTABLE (${this_target} ${${this_target}_SOURCE_FILES}) + +# Set link libraries and link options +TARGET_LINK_LIBRARIES(${this_target} -L/usr/lib/osp osp-appfw osp-uifw pthread) +TARGET_LINK_LIBRARIES(${this_target} -Xlinker --allow-shlib-undefined -pthread -pie) + +# Copy info, data, res, and icons directories +INSTALL(TARGETS ${this_target} DESTINATION ../usr/apps/${PKG_ID}/bin) + +# Copy resource +INSTALL(FILES ${CMAKE_SOURCE_DIR}/manifest.xml DESTINATION ../usr/apps/${PKG_ID}/info) +INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/Installer/res DESTINATION ../usr/apps/${PKG_ID}) +INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/Installer/shared DESTINATION ../usr/apps/${PKG_ID}) diff --git a/Installer/inc/AppResourceId.h b/Installer/inc/AppResourceId.h new file mode 100644 index 0000000..19cb6aa --- /dev/null +++ b/Installer/inc/AppResourceId.h @@ -0,0 +1,70 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// 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. +// + +/** + * @file AppResourceId.h + * @brief This is the header file for resource definition. + */ + +#ifndef _APP_RESOURCE_ID_H_ +#define _APP_RESOURCE_ID_H_ + +extern const wchar_t* IDC_BUTTON_CANCEL; +extern const wchar_t* IDC_BUTTON_INSTALL; +extern const wchar_t* IDC_BUTTON_LAUNCH; +extern const wchar_t* IDC_BUTTON_REINSTALL; +extern const wchar_t* IDC_LABEL; +extern const wchar_t* IDC_LABEL_EX; +extern const wchar_t* IDC_LABEL_MAIN_TEXT; +extern const wchar_t* IDC_LABEL_MESSAGE; +extern const wchar_t* IDC_LABEL_SUB_TEXT; +extern const wchar_t* IDC_LABEL_VERSION; +extern const wchar_t* IDC_PANEL; +extern const wchar_t* IDC_SECTIONTABLEVIEW; +extern const wchar_t* IDL_DETAIL_FORM; +extern const wchar_t* IDL_INSTALLED_POPUP; +extern const wchar_t* IDL_PANEL_BACKGROUND_BUTTON_ITEM; +extern const wchar_t* IDL_PANEL_EXPANDABLE_ITEM; +extern const wchar_t* IDS_APINST_BODY_DOWNLOADED_VERSION_C_ABB; +extern const wchar_t* IDS_APINST_BODY_INSTALLED_VERSION_C_ABB; +extern const wchar_t* IDS_APINST_BODY_INSTALLING_PS_ING; +extern const wchar_t* IDS_APINST_BODY_THIS_APPLICATION_MAY_BE_HARMFUL_AND_DAMAGE_YOUR_DEVICE_OR_DATA; +extern const wchar_t* IDS_APINST_BODY_UNABLE_TO_INSTALL_NOT_ENOUGH_MEMORY_ABB; +extern const wchar_t* IDS_APINST_BUTTON_ALLOW_AND_INSTALL_ABB; +extern const wchar_t* IDS_APINST_BUTTON_OPEN; +extern const wchar_t* IDS_APINST_BUTTON_REINSTALL; +extern const wchar_t* IDS_APINST_BUTTON_UPDATE; +extern const wchar_t* IDS_APINST_HEADER_PERMISSION_REQUESTS_ABB; +extern const wchar_t* IDS_APINST_HEADER_WARNING; +extern const wchar_t* IDS_APINST_POP_AN_OLDER_VERSION_IS_ALREADY_INSTALLED_ON_YOUR_DEVICE_IT_WILL_BE_UPDATED; +extern const wchar_t* IDS_APINST_POP_A_NEWER_VERSION_IS_ALREADY_INSTALLED_ON_YOUR_DEVICE_IT_WILL_BE_REPLACED_WITH_THE_OLDER_VERSION; +extern const wchar_t* IDS_APINST_POP_FAILED; +extern const wchar_t* IDS_APINST_POP_INSTALLED; +extern const wchar_t* IDS_APINST_POP_THIS_VERSION_IS_ALREADY_INSTALLED_ON_YOUR_DEVICE_IT_WILL_BE_REINSTALLED; +extern const wchar_t* IDS_APINST_POP_UNABLE_TO_INSTALL_THIS_FILE_THE_FORMAT_IS_INVALID; +extern const wchar_t* IDS_PB_POP_ERROR; +extern const wchar_t* IDS_ST_SK3_CANCEL; +extern const wchar_t* ID_SCNT_DETAIL_SCENE; + +enum +{ + IDA_BUTTON_REINSTALL = 10000, + IDA_BUTTON_LAUNCH, + IDA_BUTTON_CANCEL, + IDA_BUTTON_INSTALL = 1000, +}; + +#endif // _APP_RESOURCE_ID_H_ diff --git a/Installer/inc/IstDetailForm.h b/Installer/inc/IstDetailForm.h new file mode 100644 index 0000000..b09ff91 --- /dev/null +++ b/Installer/inc/IstDetailForm.h @@ -0,0 +1,76 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// 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. +// + +/** + * @file IstDetailForm.h + * @brief This file contains declaration of DetailForm class, which acts as a + * application installer displaying a list of all the privilege description in the TPK file. + */ + +#ifndef _IST_DETAIL_FORM_H_ +#define _IST_DETAIL_FORM_H_ + +#include +#include +#include +#include + +class DetailForm + : public Tizen::Ui::Controls::Form + , public virtual Tizen::Ui::IActionEventListener + , public virtual Tizen::Ui::Controls::IFormBackEventListener + , public virtual Tizen::Ui::Controls::ISectionTableViewItemEventListener + , public virtual Tizen::Ui::Controls::ISectionTableViewItemProviderF + , public virtual Tizen::Ui::Scenes::ISceneEventListener + , public virtual Tizen::Ui::IOrientationEventListener +{ +public: + DetailForm(void); + virtual ~DetailForm(void); + result Initialize(); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, const Tizen::Ui::Scenes::SceneId& nextSceneId); + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(int sectionIndex, int itemIndex, float itemWidth); + virtual bool DeleteItem(int sectionIndex, int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual float GetDefaultItemHeight(void); + virtual int GetItemCount(int sectionIndex); + virtual int GetSectionCount(void); + virtual Tizen::Base::String GetSectionFooter(int sectionIndex); + virtual Tizen::Base::String GetSectionHeader(int sectionIndex); + virtual bool HasSectionFooter(int sectionIndex); + virtual bool HasSectionHeader(int sectionIndex); + virtual void UpdateItem(int sectionIndex, int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void OnSectionTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::SectionTableView& tableView, int sectionIndex, int itemIndex, Tizen::Ui::Controls::TableViewContextItem* pContextItem, bool activated); + virtual void OnSectionTableViewItemStateChanged(Tizen::Ui::Controls::SectionTableView& tableView, int sectionIndex, int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem, Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnOrientationChanged(const Tizen::Ui::Control& source, Tizen::Ui::OrientationStatus orientationStatus); +private: + bool GetPrivilegeListIndex(int actualIndex, int& privilegeIndex); + float GetTextHeight(const Tizen::Base::String& text, const Tizen::Graphics::Font& font, float width); +private: + Tizen::Base::Collection::ArrayList* __pPrivilegeList; + Tizen::Graphics::Bitmap* __pExpandCloseIcon; + Tizen::Graphics::Bitmap* __pExpandOpenIcon; + bool* __pExposedItemList; + float __fontSize; + float __childFontSize; +}; + +#endif diff --git a/Installer/inc/IstFormFactory.h b/Installer/inc/IstFormFactory.h new file mode 100644 index 0000000..9ba4fee --- /dev/null +++ b/Installer/inc/IstFormFactory.h @@ -0,0 +1,38 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// 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. +// + +/** + *@file IstFormFactory.h + *@brief This file contains the implementation FormFactory class, which manages + * all the forms of the application. + */ + +#ifndef _IST_FORM_FACTORY_H_ +#define _IST_FORM_FACTORY_H_ + +#include + +class FormFactory + : public virtual Tizen::Ui::Scenes::IFormFactory +{ +public: + FormFactory(void); + virtual ~FormFactory(void); + + virtual Tizen::Ui::Controls::Form* CreateFormN(const Tizen::Base::String& formId, const Tizen::Ui::Scenes::SceneId& sceneId); +}; + +#endif // _IST_FORM_FACTORY_H_ diff --git a/Installer/inc/IstInstalledPopup.h b/Installer/inc/IstInstalledPopup.h new file mode 100644 index 0000000..c376c2a --- /dev/null +++ b/Installer/inc/IstInstalledPopup.h @@ -0,0 +1,55 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// 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. +// + +/** + * @file InstalledPopup.h + * @brief This file contains declaration of InstalledPopup class. + */ + +#ifndef _IST_INSTALLED_POPUP_H_ +#define _IST_INSTALLED_POPUP_H_ + +#include +#include + +class InstalledPopup + : public Tizen::Ui::Controls::Popup + , public virtual Tizen::Ui::IActionEventListener + , public virtual Tizen::Ui::IPropagatedKeyEventListener +{ +public: + InstalledPopup(); + virtual ~InstalledPopup(); + result Initialize(Tizen::Ui::Control* pTarget); + result RequestPopup(const Tizen::Base::String& appName, const Tizen::Base::String& installedVersion, + const Tizen::Base::String& currentVersion, bool isLaunchable); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + virtual bool OnKeyPressed(Tizen::Ui::Control &source, const Tizen::Ui::KeyEventInfo &keyEventInfo){return false;}; + virtual bool OnKeyReleased(Tizen::Ui::Control &source, const Tizen::Ui::KeyEventInfo &keyEventInfo); + virtual bool OnPreviewKeyPressed(Tizen::Ui::Control &source, const Tizen::Ui::KeyEventInfo &keyEventInfo){return false;}; + virtual bool OnPreviewKeyReleased(Tizen::Ui::Control &source, const Tizen::Ui::KeyEventInfo &keyEventInfo){return false;}; +private: + Tizen::Ui::Control* __pTarget; + Tizen::Base::String __installMessage; + Tizen::Base::String __versionMessage; + bool __isLaunchable; +}; + +#endif /* _IST_INSTALLED_POPUP_H_ */ diff --git a/Installer/inc/IstInstallerApp.h b/Installer/inc/IstInstallerApp.h new file mode 100644 index 0000000..260869b --- /dev/null +++ b/Installer/inc/IstInstallerApp.h @@ -0,0 +1,54 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// 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. +// + +/** + * @file IstInstallerApp.h + * @brief This file contains the declaration of InstallerApp Class, + * which provides basic features necessary to define an UiApp. + */ + +#ifndef _IST_INSTALLER_APP_H_ +#define _IST_INSTALLER_APP_H_ + +#include +#include +#include + +class InstallerApp + : public Tizen::App::UiApp + , public virtual Tizen::App::IAppControlProviderEventListener +{ +public: + InstallerApp(void); + virtual~InstallerApp(void); + const Tizen::App::Package::PackageInfo* GetPackageInfo(void) const; + Tizen::Base::String GetPackageFilePath(void) const; + + virtual bool OnAppInitializing(Tizen::App::AppRegistry& appRegistry); + virtual bool OnAppInitialized(void); + virtual bool OnAppTerminating(Tizen::App::AppRegistry& appRegistry, bool forcedTermination = false); + virtual void OnBackground(void); + virtual void OnAppControlRequestReceived(RequestId reqId, const Tizen::Base::String& operationId, + const Tizen::Base::String* pUriData, const Tizen::Base::String* pMimeType, const Tizen::Base::Collection::IMap* pExtraData); + + static Tizen::App::UiApp* CreateInstance(void); + +private: + Tizen::App::Package::PackageInfo* __pPackageInfo; + Tizen::Base::String __packageFilePath; +}; + +#endif // _IST_INSTALLER_APP_H_ diff --git a/Installer/inc/IstMainFrame.h b/Installer/inc/IstMainFrame.h new file mode 100644 index 0000000..3fe106b --- /dev/null +++ b/Installer/inc/IstMainFrame.h @@ -0,0 +1,45 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// 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. +// + +/** + * @file IstMainFrame.h + * @brief This file contains declaration of MainFrame class, which is the main frame of the application. + */ + +#ifndef _IST_MAIN_FRAME_H_ +#define _IST_MAIN_FRAME_H_ + +#include +#include +#include +#include "IstInstalledPopup.h" + +class MainFrame + : public Tizen::Ui::Controls::Frame +{ +public: + MainFrame(void); + virtual ~MainFrame(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs); +private: + InstalledPopup* __pInstalledPopup; + Tizen::App::AppId __mainAppId; +}; + +#endif //_IST_MAIN_FRAME_H_ diff --git a/Installer/manifest.xml b/Installer/manifest.xml new file mode 100644 index 0000000..a8830ac --- /dev/null +++ b/Installer/manifest.xml @@ -0,0 +1,38 @@ + + + D7eOJquGtL + 1.0.0 + C++App + + true + true + true + + + 2.2 + + http://tizen.org/privilege/packagemanager.info + http://tizen.org/privilege/package.info + http://tizen.org/privilege/application.launch + + + + + + Installer + + + mainmenu.png + + + + application/vnd.tizen.package + application/vnd.wac.widget-sharing + application/widget + http://tizen.org/appcontrol/operation/view + + + + + + diff --git a/Installer/res/.workflow b/Installer/res/.workflow new file mode 100644 index 0000000000000000000000000000000000000000..d7052d5b87aa057502d6b66330f70ce35de9ac90 GIT binary patch literal 5321 zcmcIn-EQ1O6rSB|(liOA=?|0&B%q*jL2Z$wX=nt}lHG!ln?%X-mz&60Pd0A7wy|gb zDp9Et;sPF^fZz`9K;nWo-~z6>;~@}_0OuUrKsQJSvFZDrGN+D5>_ze14}b+%x5 z-kvagu>~sxTh{?lB|udIsuEC*0aXH2<<1SA&2pPJxg!F>F6j4-wxPC!WvjXsh>fn# zR&#k;4Y3keS=R%)Yq>zAcL_{EXEUDRgPVfg%EvVf9#UD)*R#mX2c=}#h+oCxniz0e6R|5OJi~NBWH`UjeBK1S8<8X$p0Pkjq&pC2?9ymM? z5F2#&6#V)Qu0K+gAasG_I2Gy3O3F--S&P8uqTYa>W$n zEDVsbpYmr0YEJY#4r1PXPtzf@+I|%Sa31t!^0rmyQIO@ifcMaRQsEbDEuRi09YmBV zquz5>rtBf4>{pqKScRzxSj7hSKph5kpL6FX_S>5dWW%uKzNEe6OKM*l&?NkY=kIWI z0Q@v13!mwvl}h-ol-4IMc{^MO z-&m;FehCwJQvPvHA%)O^^!TMq>U=1BMeJt}PKD-YBcJgz4 MoY^q&Xglcs2kCqvfB*mh literal 0 HcmV?d00001 diff --git a/Installer/res/ara-AE.xml b/Installer/res/ara-AE.xml new file mode 100644 index 0000000..1f3b3d6 --- /dev/null +++ b/Installer/res/ara-AE.xml @@ -0,0 +1,25 @@ + + + + الإصدار الذي تم تنزيله: %ls + طلبات الإذن + إلغاء + قد يكون هذا التطبيق ضارا وربما يؤدي إلى تلف الجهاز أو البيانات + يوجد إصدار أحدث مثبت بالفعل على جهازك. سيتم استبدال الإصدار الأقدم به + يتعذر تثبيت هذا الملف. التنسيق غير صالح + تم التثبيت + تحديث + تحذير + فتح + فشل + يتعذر التثبيت. مساحة الذاكرة غير كافية + يوجد إصدار أقدم مثبت بالفعل على جهازك. سيتم تحديثه + الإصدار الذي تم تثبيته: %ls + السماح والتثبيت + خطأ + هذا الإصدار مثبت بالفعل على جهازك. ستتم إعادة تثبيته + يتم تثبيت %ls... + إعادة التثبيت + diff --git a/Installer/res/aze-AZ.xml b/Installer/res/aze-AZ.xml new file mode 100644 index 0000000..d6409a7 --- /dev/null +++ b/Installer/res/aze-AZ.xml @@ -0,0 +1,25 @@ + + + + Yüklənmiş versiya: %ls + İcazə sorğuları + Ləğv et + Bu proqram zərərli ola və cihaz və ya məlumatlarınızı zədələyə bilər + Daha yeni versiya artıq cihazınızda quraşdırılıb. O, köhnə versiya ilə əvəz ediləcək + Bu faylı quraşdırmaq mümkün deyil. Format səhvdir + Quruldu + Yenilə + Xəbərdarlıq + Aç + Mümkün olmadı + Quraşdırmaq mümkün deyil. Yaddaş azdır. + Daha köhnə versiya artıq cihazınızda quraşdırılıb. O, yenilənəcək + Quraşdırılmış versiya: %ls + İcazə ver və quraşdır + Xəta + Bu versiya artıq cihazınızda quraşdırılıb. O, yenidən quraşdırılacaq + Quraşdırılır %ls... + Yenidən quraşdır + diff --git a/Installer/res/bul-BG.xml b/Installer/res/bul-BG.xml new file mode 100644 index 0000000..da9c9ee --- /dev/null +++ b/Installer/res/bul-BG.xml @@ -0,0 +1,25 @@ + + + + Изтеглена версия: %ls + Искания за разрешения + Отмени + Това приложение може да е опасно и да навреди на устройството или данните ви + На устройството ви вече е инсталирана по-нова версия. Тя ще бъде заменена с по-старата версия + Този файл не може да се инсталира. Форматът е невалиден + Инсталирано + Актуализиране + Предупреждение + Отвори + Неуспешно + Не може да се инсталира. Няма достатъчно памет + На устройството ви вече е инсталирана по-стара версия. Тя ще се актуализира + Инсталирана версия: %ls + Позволи и инсталирай + Грешка + Тази версия вече е инсталирана на устройството ви. Тя ще се преинсталира + Инсталиране на %ls... + Преинсталиране + diff --git a/Installer/res/cat-ES.xml b/Installer/res/cat-ES.xml new file mode 100644 index 0000000..81cce2e --- /dev/null +++ b/Installer/res/cat-ES.xml @@ -0,0 +1,25 @@ + + + + Versió descarregada: %ls + Sol·licituds de permís + Cancel·lar + Aquesta aplicació pot ser perillosa i pot malmetre el seu dispositiu o les seves dades + Ja hi ha una versió més nova instal·lada al seu dispositiu. Se substituirà per la versió més antiga + No es pot instal·lar aquest fitxer. El format no és vàlid + Instal·lat + Actualitzar + Advertiment + Obrir + Error + No es pot desinstal·lar. No hi ha prou memòria + Ja hi ha una versió més antiga instal·lada al seu dispositiu. S'actualitzarà + Versió instal·lada: %ls + Permetre i instal·lar + Error + Aquesta versió ja està instal·lada al seu dispositiu. Es tornarà a instal·lar + Instal·lant %ls... + Reinstal·lar + diff --git a/Installer/res/ces-CZ.xml b/Installer/res/ces-CZ.xml new file mode 100644 index 0000000..9d987d8 --- /dev/null +++ b/Installer/res/ces-CZ.xml @@ -0,0 +1,25 @@ + + + + Stažená verze: %ls + Požadavky na oprávnění + Zrušit + Aplikace může být škodlivá a může poškodit zařízení nebo data + V zařízení je již nainstalována novější verze. Bude nahrazena starší verzí + Soubor se nepodařilo nainstalovat. Má neplatný formát + Nainstalováno + Aktualizovat + Upozornění + Otevřít + Nezdařilo se + Nelze nainstalovat. Nedostatek paměti + V zařízení je již nainstalována starší verze. Bude aktualizována + Instalovaná verze: %ls + Povolit a nainstalovat + Chyba + Tato verze je již v zařízení nainstalována. Bude nainstalována znovu + Instalace %ls... + Nainstalovat znovu + diff --git a/Installer/res/dan-DK.xml b/Installer/res/dan-DK.xml new file mode 100644 index 0000000..fcbf8a3 --- /dev/null +++ b/Installer/res/dan-DK.xml @@ -0,0 +1,25 @@ + + + + Overført version: %ls + Anm. om tilladelse + Annullér + Dette program kan være skadeligt og beskadige din enhed eller dine data + En nyere version er allerede installeret på din enhed. Den vil blive erstattet af den ældre version. + Kunne ikke installere denne fil. Formatet er ugyldigt. + Installeret + Opdatér + Advarsel + Åben + Mislykkedes + Kunne ikke installere. Ikke nok hukommelse. + En ældre version er allerede installeret på din enhed. Den vil blive opdateret. + Installeret version: %ls + Tillad, og installér + Fejl + Denne version er allerede installeret på din enhed. Den vil blive geninstalleret. + Installerer %ls ... + Geninstallér + diff --git a/Installer/res/deu-DE.xml b/Installer/res/deu-DE.xml new file mode 100644 index 0000000..9845ec2 --- /dev/null +++ b/Installer/res/deu-DE.xml @@ -0,0 +1,25 @@ + + + + Heruntergeladene Version: %ls + Berechtigung angefragt + Abbrechen + Diese Anwendung kann Ihr Gerät oder Ihre Daten beschädigen. + Auf Ihrem Gerät ist bereits eine neuere Version installiert. Diese wird durch die ältere Version ersetzt. + Installation dieser Datei nicht möglich. Das Format ist ungültig. + Installiert + Aktualisieren + Warnung + Offen + Fehlgeschlagen + Install. nicht möglich. Nicht genügend Speicher. + Auf Ihrem Gerät ist bereits eine ältere Version installiert. Diese wird aktualisiert. + Installierte Version: %ls + Zulassen und install. + Fehler + Diese Version ist bereits auf Ihrem Gerät installiert. Sie wird neu installiert. + %ls Installieren... + Neu installieren + diff --git a/Installer/res/ell-GR.xml b/Installer/res/ell-GR.xml new file mode 100644 index 0000000..feffd58 --- /dev/null +++ b/Installer/res/ell-GR.xml @@ -0,0 +1,25 @@ + + + + Ληφθείσα έκδοση: %ls + Αιτήματα δικαιωμάτων + Άκυρο + Αυτή η εφαρμογής ενδέχεται να είναι επιβλαβής και να καταστρέψει τη συσκευή ή τα δεδομένα σας + Έχει ήδη εγκατασταθεί η νεότερη έκδοση στη συσκευή σας. Θα αντικατασταθεί από την παλαιότερη έκδοση + Δεν είναι δυνατή η εγκατάσταση αυτού του αρχείου. Η μορφή δεν είναι έγκυρη + Εγκαταστάθηκε + Ενημέρωση + Προειδοποίηση + Άνοιγμα + Αποτυχία + Δεν ήταν δυνατή η εγκατάσταση. Ανεπαρκής μνήμη + Έχει ήδη εγκατασταθεί μια παλαιότερη έκδοση στη συσκευή σας. Θα ενημερωθεί + Εγκατεστημένη έκδοση: %ls + Αποδοχή και εγκατάσταση + Σφάλμα + Αυτή η έκδοση έχει ήδη εγκατασταθεί στη συσκευή σας. Θα γίνει επανάληψη της εγκατάστασης + Εγκατάσταση %ls... + Επανάληψη εγκατάστασης + diff --git a/Installer/res/eng-GB.xml b/Installer/res/eng-GB.xml new file mode 100644 index 0000000..3b44369 --- /dev/null +++ b/Installer/res/eng-GB.xml @@ -0,0 +1,25 @@ + + + + Downloaded version: %ls + Permission requests + Cancel + This application may be harmful and damage your device or data + A newer version is already installed on your device. It will be replaced with the older version. + Unable to install this file. The format is invalid. + Installed + Update + Warning + Open + Failed + Unable to install. Not enough memory. + An older version is already installed on your device. It will be updated. + Installed version: %ls + Allow and install + Error + This version is already installed on your device. It will be reinstalled. + Installing %ls... + Reinstall + diff --git a/Installer/res/eng-PH.xml b/Installer/res/eng-PH.xml new file mode 100644 index 0000000..3b44369 --- /dev/null +++ b/Installer/res/eng-PH.xml @@ -0,0 +1,25 @@ + + + + Downloaded version: %ls + Permission requests + Cancel + This application may be harmful and damage your device or data + A newer version is already installed on your device. It will be replaced with the older version. + Unable to install this file. The format is invalid. + Installed + Update + Warning + Open + Failed + Unable to install. Not enough memory. + An older version is already installed on your device. It will be updated. + Installed version: %ls + Allow and install + Error + This version is already installed on your device. It will be reinstalled. + Installing %ls... + Reinstall + diff --git a/Installer/res/eng-US.xml b/Installer/res/eng-US.xml new file mode 100644 index 0000000..7ad4395 --- /dev/null +++ b/Installer/res/eng-US.xml @@ -0,0 +1,25 @@ + + + + Downloaded version: %ls + Permission requests + Cancel + This application may be harmful, and may damage your device or data + A newer version is already installed on your device. It will be replaced with the older version. + Unable to install this file. The format is invalid. + Installed + Update + Warning + Open + Failed + Unable to install. Not enough memory. + An older version is already installed on your device. It will be updated. + Installed version: %ls + Allow and install + Error + This version is already installed on your device. It will be reinstalled. + Installing %ls... + Reinstall + diff --git a/Installer/res/est-EE.xml b/Installer/res/est-EE.xml new file mode 100644 index 0000000..e0555cf --- /dev/null +++ b/Installer/res/est-EE.xml @@ -0,0 +1,25 @@ + + + + Allalaetud versioon: %ls + Lubade taotlused + Tühista + See rakendus võib olla ohtlik ja võib kahjustada teie seadet või andmeid + Uuem versioon on teie seadmesse juba installitud. See asendatakse vanema versiooniga + Seda faili ei saa installida. Vale vorming + Installitud + Värskenda + Hoiatus + Ava + Nurjus + Ei saa installida. Mälu pole piisavalt + Vanem versioon on teie seadmesse juba installitud. Seda värskendatakse + Installitud versioon: %ls + Luba ja installi + Tõrge + See versioon on teie seadmesse juba installitud. See installitakse uuesti + Rakenduse %ls installimine... + Installi uuesti + diff --git a/Installer/res/eus-ES.xml b/Installer/res/eus-ES.xml new file mode 100644 index 0000000..bc6d20a --- /dev/null +++ b/Installer/res/eus-ES.xml @@ -0,0 +1,25 @@ + + + + Deskargatutako bertsioa: %ls + Baimen eskaera + Ezeztatu + Baliteke aplikazio hau kaltegarria izatea eta zure gailua edo datuak kaltetzea + Zure gailuan bertsio berriago bat dago instalatuta. Bertsio zaharragoarekin ordezkatuko da + Ezin da fitxategi hau instalatu. Formatua baliogabea da + Instalatuta + Eguneratu + Oharra + Ireki + Huts egin du + Ezin da instalatu. Ez dago nahikoa memoria + Zure gailuan bertsio zaharrago bat dago instalatuta. Eguneratu egingo da + Instalatutako bertsioa: %ls + Baimendu eta instalatu + Akatsa + Bertsio hau zure gailuan instalatuta dago. Berrinstalatu egingo da + %ls instalatzen... + Berriz instalatu + diff --git a/Installer/res/fin-FI.xml b/Installer/res/fin-FI.xml new file mode 100644 index 0000000..908f451 --- /dev/null +++ b/Installer/res/fin-FI.xml @@ -0,0 +1,25 @@ + + + + Ladattu versio: %ls + Lupapyynnöt + Peruuta + Tämä sovellus voi olla vaarallinen ja vahingoittaa laitetta tai tietoja + Laitteeseen on jo asennettu uudempi versio. Se korvataan vanhemmalla versiolla + Tätä tiedostoa ei voi asentaa. Sen muoto on virheellinen + Asennettu + Päivitä + Varoitus + Avaa + Epäonnistui + Ei voi asentaa. Muisti ei riitä + Laitteeseen on jo asennettu vanhempi versio. Se päivitetään + Asennettu versio: %ls + Salli ja asenna + Virhe + Tämä versio on jo asennettu laitteeseen. Se asennetaan uudelleen + Asennetaan %ls... + Asenna uudelleen + diff --git a/Installer/res/fra-CA.xml b/Installer/res/fra-CA.xml new file mode 100644 index 0000000..9d585ca --- /dev/null +++ b/Installer/res/fra-CA.xml @@ -0,0 +1,25 @@ + + + + Version téléchargée : %ls + Demandes d'autorisation + Annuler + Cette application peut être dangereuse et endommager votre appareil ou vos données + Une version plus récente est déjà installée sur votre appareil. Elle va être remplacée par la version plus ancienne + Impossible d'installer ce fichier. Le format n'est pas valide + Installé + Mise à jour + Avertissement + Ouvrir + Échec + Installation impossible. Mémoire insuffisante + Une version plus ancienne est déjà installée sur votre appareil. Elle va être mise à jour + Version installée : %ls + Autoriser et installer + Erreur + Cette version est déjà installée sur votre appareil. Elle va être réinstallée + Installation de %ls... + Réinstaller + diff --git a/Installer/res/fra-FR.xml b/Installer/res/fra-FR.xml new file mode 100644 index 0000000..8fce6ee --- /dev/null +++ b/Installer/res/fra-FR.xml @@ -0,0 +1,25 @@ + + + + Version téléchargée : %ls + Demandes d'autorisation + Annuler + Cette application peut être dangereuse et endommager votre appareil ou vos données + Une version plus récente est déjà installée sur votre appareil. Elle va être remplacée par la version plus ancienne + Impossible d'installer ce fichier. Le format n'est pas valide + Installée + Mise à jour + Avertissement + Ouvrir + Échec + Installation impossible. Mémoire insuffisante + Une version plus ancienne est déjà installée sur votre appareil. Elle va être mise à jour + Version installée : %ls + Autoriser et installer + Erreur + Cette version est déjà installée sur votre appareil. Elle va être réinstallée + Installation de %ls... + Réinstaller + diff --git a/Installer/res/gle-IE.xml b/Installer/res/gle-IE.xml new file mode 100644 index 0000000..086c21c --- /dev/null +++ b/Installer/res/gle-IE.xml @@ -0,0 +1,25 @@ + + + + Leagan íoslódáilte: %ls + Iarratais ar chead + Cuir ar ceal + Is féidir go ndéanfaidh an feidhmchlár seo dochar do do ghléas nó sonraí + Tá leagan níos nuaí suiteáilte ar do ghléas cheana. Athsholáthrófar é leis an leagan níos sine + Ní féidir an comhad seo a shuiteáil. Tá an fhormáid neamhbhailí + Suiteáilte + Nuashonraigh + Rabhadh + Oscail + Theip air + Ní féidir é a shuiteáil. Easpa cuimhne + Tá leagan níos sine suiteáilte ar do ghléas cheana. Nuashonrófar é + Leagan suiteáilte: %ls + Ceadaigh agus suiteáil + Earráid + Tá leagan seo suiteáilte ar do ghléas cheana. Athshuiteálfar é + Suiteáil %ls... + Athshuiteáil + diff --git a/Installer/res/glg-ES.xml b/Installer/res/glg-ES.xml new file mode 100644 index 0000000..559d280 --- /dev/null +++ b/Installer/res/glg-ES.xml @@ -0,0 +1,25 @@ + + + + Versión descargada: %ls + Solicitudes de permiso + Cancelar + É posible que esta aplicación resulte daniña e dane o teu dispositivo ou datos + Xa hai unha versión máis nova instalada no teu dispositivo. Será substituída pola versión anterior + Non se pode instalar este arquivo. O formato non é válido + Instalados + Actualizar + Aviso + Abrir + Erro + Non se pode instalar. Non hai memoria suficiente + Xa hai unha versión anterior instalada no teu dispositivo. Actualizarase + Versión instalada: %ls + Permitir e instalar + Erro + Esta versión xa está instalada no teu dispositivo. Reinstalarase + Instalando %ls... + Reinstalar + diff --git a/Installer/res/hin-IN.xml b/Installer/res/hin-IN.xml new file mode 100644 index 0000000..0b81606 --- /dev/null +++ b/Installer/res/hin-IN.xml @@ -0,0 +1,25 @@ + + + + डाउनलोड किया गया संस्करण: %ls + अनु‍मति के अनुरोध + रद्द + यह एप्लीकेशन हानिकारक हो सकता है और आपके डिवाइस या डाटा को क्षति पहुँचा सकती है + एक नया संस्करण आपके डिवाइस पर पहले से स्थापित है। इसे पुराने संस्करण के साथ बदला जाएगा। + इस फ़ाइल को स्थापित करने में अक्षम। फ़ॉर्मेट अमान्य है। + स्थापित किया + अपडेट करें + चेतावनी + खोलें + विफल + स्थापित करने में अक्षम। पर्याप्त मेमोरी नहीं। + एक पुराना संस्करण आपके डिवाइस पर पहले से स्थापित है। इसे अपडेट किया जाएगा। + स्थापित संस्करण: %ls + अनुमति दें और स्थापित करें + त्रुटि + यह संस्करण आपके डिवाइस पर पहले से स्थापित है। इसे पुन: %ls स्थापित किया जाएगा। + %ls स्थापित हो रहा है... + पुन: स्थापना करें + diff --git a/Installer/res/hrv-HR.xml b/Installer/res/hrv-HR.xml new file mode 100644 index 0000000..5ddc699 --- /dev/null +++ b/Installer/res/hrv-HR.xml @@ -0,0 +1,25 @@ + + + + Skinuta verzija: %ls + Zahtjevi za odobrenje + Prekid + Ova aplikacija može biti šetna i može oštetiti vaš uređaj ili podatke + Novija verzija već je instalirana na vašem uređaju. Zamijenit će se starijom verzijom + Nemoguće instalirati ovu datoteku. Neispravan format + Instalirano + Aktualiziraj + Upozorenje + Otvori + Neuspješno + Nemoguće instalirati. Nedovoljno memorije + Starija verzija već je instalirana na vašem uređaju. Aktualizirat će se + Instalirana verzija: %ls + Dopusti i instaliraj + Greška + Ova verzija već je instalirana na vašem uređaju. Ponovno će se instalirati + Instaliranje %ls... + Ponovno instaliraj + diff --git a/Installer/res/hun-HU.xml b/Installer/res/hun-HU.xml new file mode 100644 index 0000000..03540e2 --- /dev/null +++ b/Installer/res/hun-HU.xml @@ -0,0 +1,25 @@ + + + + Letöltött verzió: %ls + Engedélykérések + Mégse + Ez az alkalmazás káros lehet, sérülést okozhat az eszközben vagy az adatokban + Már telepítve van az eszközön egy újabb verzió. Ez le lesz cserélve a régebbi verzióra + Nem lehet telepíteni a fájlt. A formátum érvénytelen + Telepítve + Frissítés + Figyelmeztetés + Megnyitás + Sikertelen + Nem lehet telepíteni. Nincs elég memória + Már telepítve van az eszközön egy régebbi verzió. Ez frissülni fog + Telepített verzió: %ls + Engedélyezi és telepíti + Hiba + Ez a verzió már telepítve van az eszközön. Újra lesz telepítve + %ls telepítése... + Újratelepítés + diff --git a/Installer/res/hye-AM.xml b/Installer/res/hye-AM.xml new file mode 100644 index 0000000..c2ff1de --- /dev/null +++ b/Installer/res/hye-AM.xml @@ -0,0 +1,25 @@ + + + + Ներբեռնված վարկածը՝ %ls + Թույլտվության հարցումներ + Չեղարկել + Այս ծրագիրը կարող է վնասակար լինել և վնասել Ձեր սարքը կամ տվյալները + Ավելի նոր վարկած է արդեն տեղադրված Ձեր սարքում: %ls Այն կփոխարինվի ավելի հին վարկածով + Անհնար է տեղադրել այս ֆայլը. ձևաչափն անվավեր է + Տեղադրված է + Թարմացնել + Զգուշացում + Բացել + Ձախողվեց + Անհնար է տեղադրել. հիշողությունը բավարար չէ: %ls + Ավելի հին վարկած է արդեն տեղադրված Ձեր սարքում: %ls Այն կթարմացվի + Տեղադրված վարկածը՝ %ls + Թույլ տալ և տեղադրել + Սխալ + Այս վարկածն արդեն տեղադրված է Ձեր սարքում: %ls Այն կվերատեղադրվի + Տեղադրվում է %ls... + Վերատեղադրել + diff --git a/Installer/res/isl-IS.xml b/Installer/res/isl-IS.xml new file mode 100644 index 0000000..a95a291 --- /dev/null +++ b/Installer/res/isl-IS.xml @@ -0,0 +1,25 @@ + + + + Sótt útgáfa: %ls + Leyfisbeiðnir + Hætta við + Þetta forrit gæti verið skaðlegt og skemmt tækið þitt eða gögn + Nýrri útgáfa er þegar sett upp í tækinu. Henni verður skipt út fyrir eldri útgáfuna + Ekki er hægt að setja upp þessa skrá. Sniðið er ógilt + Uppsett + Uppfæra + Viðvörun + Opna + Mistókst + Ekki hægt að setja upp. Ekki nægt minni + Eldri útgáfa er þegar sett upp í tækinu. Hún verður uppfærð + Uppsett útgáfa: %ls + Leyfa og setja upp + Villa + Þessi útgáfa er þegar sett upp í tækinu. Hún verður sett upp aftur + Set upp %ls... + Setja upp aftur + diff --git a/Installer/res/ita-IT.xml b/Installer/res/ita-IT.xml new file mode 100644 index 0000000..92c6b9a --- /dev/null +++ b/Installer/res/ita-IT.xml @@ -0,0 +1,25 @@ + + + + Versione scaricata: %ls + Richieste autorizzazione + Annulla + Quest'applicazione potrebbe essere dannosa e danneggiare il dispositivo o i dati + Una versione più recente è già installata sul dispositivo in uso. Verrà sostituita con quella meno recente + Impossibile installare questo file perché il formato non è valido + Installazione eseguita + Aggiorna + Avviso + Apri + Errore + Impossibile installare. Memoria insufficiente + Una versione precedente è già installata sul dispositivo in uso. Verrà aggiornata + Versione installata: %ls + Consenti e installa + Errore + Questa versione è già installata sul dispositivo in uso. Verrà installata nuovamente + Installazione di %ls in corso... + Installa nuovamente + diff --git a/Installer/res/jpn-JP.xml b/Installer/res/jpn-JP.xml new file mode 100644 index 0000000..0c7fa61 --- /dev/null +++ b/Installer/res/jpn-JP.xml @@ -0,0 +1,25 @@ + + + + ダウンロードしたバージョン: %ls + 権限の要求 + キャンセル + このアプリケーションは有害であり、お客様の端末やデータを破損する恐れがあります。 + 新しいバージョンが既に端末にインストールされています。古いバージョンに置き換えられます。 + このファイルをインストールできません。フォーマットが無効です。 + インストールしました。 + 更新 + 警告 + 開く + 失敗しました。 + インストールできません。メモリ空き容量が低下しています。 + 古いバージョンが既に端末にインストールされています。更新します。 + インストール済みのバージョン: %ls + 許可してインストール + エラー + このバージョンは既に端末にインストールされています。再インストールします。 + %lsをインストール中... + 再インストール + diff --git a/Installer/res/kat-GE.xml b/Installer/res/kat-GE.xml new file mode 100644 index 0000000..7bef330 --- /dev/null +++ b/Installer/res/kat-GE.xml @@ -0,0 +1,25 @@ + + + + ჩამოტვირთული ვერსია: %ls + საჭიროა ნებართვა + გაუქმება + ეს პროგრამა შეიძლება საზიანო იყოს და დააზიანოს თქვენი მოწყობილობა ან მონაცემები + შედარებით ახალი ვერსია უკვე დაინსტალირებულია მოწყობილობაში. იგი შეიცვლება უფრო ძველი ვერსიით + ამ ფაილს ვერ დააინსტალირებთ. ფორმატი არასწორია + დაინსტალირდა + განახლება + გაფრთხილება + გახსნა + ვერ შესრულდა + ვერ ინსტალირდება. არ არის საკმარისი მეხსიერება + შედარებით ძველი ვერსია უკვე დაინსტალირებულია მოწყობილობაში. იგი განახლდება + დაინსტალირებული ვერსია: %ls + ნებართვა და ინსტალაცია + შეცდომა + ეს ვერსია უკვე დაინსტალირებულია მოწყობილობაში. იგი თავიდან დაინსტალირდება + ინსტალირდება %ls... + თავიდან დაინსტალირება + diff --git a/Installer/res/kaz-KZ.xml b/Installer/res/kaz-KZ.xml new file mode 100644 index 0000000..e6c9148 --- /dev/null +++ b/Installer/res/kaz-KZ.xml @@ -0,0 +1,25 @@ + + + + Жүктелген нұсқа: %ls + Рұқсат сұрайды + Тоқтату + Бұл бағдарлама құрылғыңыз немесе деректеріңізге зиянды немесе зақым келтіруі мүмкін + Жаңа нұсқа құрылғыңызда әлдеқашан орнатылған. Ол ескі нұсқамен ауыстырылады + Бұл файлды орнату мүмкін емес. Пішім жарамсыз + Орнатылды + Жаңарту + Ескерту + Ашу + Үзіліп кетті + Орнату мүмкін емес. Жад жеткіліксіз + Ескі нұсқа құрылғыңызда әлдеқашан орнатылған. Ол жаңартылады + Орнатылған нұсқа: %ls + Рұқсат беру және орнату + Қате + Бұл нұсқа құрылғыңызда әлдеқашан орнатылған. Ол қайта орнатылады + %ls орнатылуда... + Қайта орнату + diff --git a/Installer/res/kor-KR.xml b/Installer/res/kor-KR.xml new file mode 100644 index 0000000..011c12d --- /dev/null +++ b/Installer/res/kor-KR.xml @@ -0,0 +1,25 @@ + + + + 다운로드한 버전: %ls + 권한 요청 + 취소 + 이 애플리케이션은 유해하여 디바이스나 데이터를 손상시킬 수 있습니다 + 새 버전이 이미 디바이스에 설치되어 있습니다. 이전 버전으로 교체합니다. + 형식이 바르지 않아 이 파일을 설치할 수 없습니다 + 설치되었습니다 + 업데이트 + 경고 + 열기 + 실패하였습니다 + 메모리가 부족하여 설치할 수 없습니다 + 이전 버전이 이미 디바이스에 설치되어 있습니다. 업데이트합니다. + 설치한 버전: %ls + 허용 및 설치 + 오류가 발생하였습니다 + 이 버전이 이미 디바이스에 설치되어 있습니다. 다시 설치합니다. + %ls 설치 중... + 다시 설치 + diff --git a/Installer/res/lav-LV.xml b/Installer/res/lav-LV.xml new file mode 100644 index 0000000..10dbcda --- /dev/null +++ b/Installer/res/lav-LV.xml @@ -0,0 +1,25 @@ + + + + Lejupielādētā versija: %ls + Atļauju pieprasījumi + Atcelt + Šī programma var būt kaitīga un sabojāt jūsu ierīci vai datus + Jūsu ierīcē jau ir instalēta jaunāka versija. Tā tiks aizstāta ar vecāko versiju + Nevar instalēt šo failu. Nederīgs formāts + Instalēšana pabeigta + Atjaunināt + Brīdinājums + Atvērt + Neizdevās + Nevar instalēt. Nepietiek atmiņas + Jūsu ierīcē jau ir instalēta vecāka versija. Tā tiks atjaunināta + Instalētā versija: %ls + Atļaut un instalēt + Kļūda + Jūsu ierīcē jau ir instalēta šī versija. Tā tiks instalēta atkārtoti + Instalē %ls... + Instalēt atkāroti + diff --git a/Installer/res/lit-LT.xml b/Installer/res/lit-LT.xml new file mode 100644 index 0000000..497daff --- /dev/null +++ b/Installer/res/lit-LT.xml @@ -0,0 +1,25 @@ + + + + Atsisiųsta versija: %ls + Leidimų prašymai + Atšaukti + Ši programa gali pakenkti ir pažeisti įrenginį ir duomenis + Naujesnė versija jau įdiegta jūsų įrenginyje. Ji bus pakeista senesne versija + Neįmanoma įdiegti šio failo. Formatas netinkamas + Įdiegta + Atnaujinti + Perspėjimas + Atidaryti + Nepavyko + Neįmanoma įdiegti. Nepakanka atminties + Senesnė versija jau įdiegta jūsų įrenginyje. Ji bus atnaujinta + Įdiegta versija: %ls + Leisti ir įdiegti + Klaida + Ši versija jau įdiegta jūsų įrenginyje. Jis bus įdiegta dar kartą + Diegiama %ls... + Įdiegti iš naujo + diff --git a/Installer/res/mkd-MK.xml b/Installer/res/mkd-MK.xml new file mode 100644 index 0000000..b399052 --- /dev/null +++ b/Installer/res/mkd-MK.xml @@ -0,0 +1,25 @@ + + + + Преземена верзија: %ls + Барања за дозвола + Откажи + Оваа апликација може да биде штетна и да го оштети Вашиот уред или податоците + На уредот е веќе инсталирана понова верзија. Ќе се замени со постарата верзија + Не може да се инсталира фајлот. Форматот е неважечки + Инсталирано + Ажурирај + Предупредување + Отвори + Неуспешно + Не може да се инсталира. Нема доволно меморија + На уредот е веќе инсталирана постара верзија. Ќе се ажурира + Инсталирана верзија: %ls + Дозволи и инсталирај + Грешка + Оваа верзија е веќе инсталирана на уредот. Ќе се одинсталира + Се инсталира %ls... + Преинсталирај + diff --git a/Installer/res/nld-NL.xml b/Installer/res/nld-NL.xml new file mode 100644 index 0000000..ae6f19c --- /dev/null +++ b/Installer/res/nld-NL.xml @@ -0,0 +1,25 @@ + + + + Gedownloade versie: %ls + Verzoeken om toestemming + Annul. + Deze applicatie kan schadelijk zijn voor uw apparaat of gegevens + Er is al een nieuwere versie op uw apparaat geïnstalleerd. Deze wordt vervangen door de oudere versie + Kan dit bestand niet installeren. De indeling is ongeldig + Geïnstalleerd + Bijwerken + Waarschuwing + Openen + Mislukt + Kan niet installeren. Onvoldoende geheugen + Er is al een oudere versie op uw apparaat geïnstalleerd. Deze wordt bijgewerkt + Geïnstalleerde versie: %ls + Toestaan en installeren + Fout + Deze versie is al op uw apparaat geïnstalleerd. De versie wordt opnieuw geïnstalleerd + %ls installeren... + Opnieuw installeren + diff --git a/Installer/res/nob-NO.xml b/Installer/res/nob-NO.xml new file mode 100644 index 0000000..2033d64 --- /dev/null +++ b/Installer/res/nob-NO.xml @@ -0,0 +1,25 @@ + + + + Nedlastet versjon: %ls + Tillatelsesforespørsler + Avbryt + Dette programmet kan være skadelig og vil kunne skade enheten din eller data på den + Det er allerede installert en nyere versjon på enheten. Den vil bli erstattet med den eldre versjonen + Kan ikke installere denne filen. Formatet er ugyldig + Installert + Oppdater + Advarsel + Åpne + Det oppstod en feil + Kan ikke installere. Ikke nok minne + Det er allerede installert en eldre versjon på enheten. Den vil bli oppdatert + Installert versjon: %ls + Tillat og installer + Feil + Denne versjonen er allerede installert på enheten. Den vil bli installert på nytt + Installerer %ls... + Installer på nytt + diff --git a/Installer/res/pol-PL.xml b/Installer/res/pol-PL.xml new file mode 100644 index 0000000..822e258 --- /dev/null +++ b/Installer/res/pol-PL.xml @@ -0,0 +1,25 @@ + + + + Pobrana wersja: %ls + Żądania zezwoleń + Anuluj + Ta aplikacja może być szkodliwa i wyrządzić szkody na Twoim urządzeniu, jak też uszkodzić dane + Na urządzeniu zainstalowano już nowszą wersję. Zostanie ona zastąpiona starszą wersją + Nie można zainstalować tego pliku. Format jest nieprawidłowy + Zainstalowano + Aktualizuj + Ostrzeżenie + Otwórz + Błąd + Nie można zainstalować. Za mało pamięci + W urządzeniu zainstalowano już starszą wersję. Zostanie ona zaktualizowana + Zainstalowana wersja: %ls + Zezwól i zainstaluj + Błąd + W urządzeniu zainstalowano już tę wersję. Zostanie ona ponownie zainstalowana + Instalowanie %ls... + Zainstaluj ponownie + diff --git a/Installer/res/por-BR.xml b/Installer/res/por-BR.xml new file mode 100644 index 0000000..2722294 --- /dev/null +++ b/Installer/res/por-BR.xml @@ -0,0 +1,25 @@ + + + + Versão baixada: %ls + Solicitações permissão + Cancelar + Este aplicativo pode ser prejudicial e danificar o dispositivo ou dados + Uma versão mais recente já está instalada no dispositivo. Ela será substituída pela versão anterior + Não é possível instalar este arquivo. O formato é inválido + Instalado + Atualizar + Aviso + Abrir + Falhou + Não é possível instalar. Sem memória suficiente + Uma versão mais antiga já está instalada no dispositivo. Ela será atualizada + Versão instalada: %ls + Permitir e instalar + Erro + Esta versão já está instalada no dispositivo. Ela será reinstalada + Instalando %ls... + Reinstalar + diff --git a/Installer/res/por-PT.xml b/Installer/res/por-PT.xml new file mode 100644 index 0000000..ba52d24 --- /dev/null +++ b/Installer/res/por-PT.xml @@ -0,0 +1,25 @@ + + + + Versão transferida: %ls + Pedidos de permissão + Cancelar + Esta aplicação pode ser perigosa e pode danificar o seu dispositivo ou os dados + Já existe uma versão mais recente instalada no seu dispositivo. Esta vai ser substituída pela versão mais antiga + Impossível instalar este ficheiro. O formato é inválido + Instalado + Actualizar + Aviso + Aberta + Falha + Impossível instalar. Memória insuficiente + Já existe uma versão mais antiga instalada no seu dispositivo. Esta vai ser actualizada + Versão instalada: %ls + Permitir e instalar + Erro + Esta versão já está instalada no seu dispositivo. Vai ser reinstalada + A instalar %ls... + Reinstalar + diff --git a/Installer/res/ron-RO.xml b/Installer/res/ron-RO.xml new file mode 100644 index 0000000..38b35de --- /dev/null +++ b/Installer/res/ron-RO.xml @@ -0,0 +1,25 @@ + + + + Versiune descărcată: %ls + Solicitări de permisiuni + Anulare + Este posibil ca această aplicaţie să fie dăunătoare şi să deterioreze dispozitivul sau datele + O versiune mai recentă este deja instalată pe dispozitiv. Aceasta va fi înlocuită cu versiunea mai veche + Nu se poate instala acest fişier. Formatul nu este valid + Instalate + Actualizare + Avertisment + Deschidere + Nereuşit + Nu se poate instala. Memorie insuficientă + O versiune mai veche este deja instalată pe dispozitiv. Aceasta va fi actualizată + Versiune instalată: %ls + Permitere şi instalare + Eroare + Această versiune este deja instalată pe dispozitiv. Va fi reinstalată + Se instalează %ls... + Reinstalare + diff --git a/Installer/res/rus-RU.xml b/Installer/res/rus-RU.xml new file mode 100644 index 0000000..c792312 --- /dev/null +++ b/Installer/res/rus-RU.xml @@ -0,0 +1,25 @@ + + + + Загруженная версия: %ls + Запросы разрешений + Отмена + Это приложение может быть опасным: %ls оно может повредить ваше устройство или данные + На устройстве уже установлена более новая версия. Она будет заменена старой версией + Не удается установить этот файл. Формат недопустим + Установлено + Обновить + Предупреждение + Открыть + Сбой + Установка невозможна. Недостаточно памяти + На устройстве уже установлена более старая версия. Она будет обновлена + Установленная версия: %ls + Разрешить и установить + Ошибка + На устройстве уже установлена эта версия. Она будет переустановлена + Установка %ls... + Переустановить + diff --git a/Installer/res/screen-density-xhigh/00_button_expand_closed.png b/Installer/res/screen-density-xhigh/00_button_expand_closed.png new file mode 100644 index 0000000000000000000000000000000000000000..129e06dacfb0cc66732973de6a2483a4536c8da8 GIT binary patch literal 3280 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 + + + + + 720 +
+ + + + +
+ + +
+ + + + + +
diff --git a/Installer/res/screen-size-normal/IDL_INSTALLED_POPUP.xml b/Installer/res/screen-size-normal/IDL_INSTALLED_POPUP.xml new file mode 100644 index 0000000..3a629a5 --- /dev/null +++ b/Installer/res/screen-size-normal/IDL_INSTALLED_POPUP.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/Installer/res/screen-size-normal/IDL_PANEL_BACKGROUND_BUTTON_ITEM.xml b/Installer/res/screen-size-normal/IDL_PANEL_BACKGROUND_BUTTON_ITEM.xml new file mode 100644 index 0000000..4bbd6d1 --- /dev/null +++ b/Installer/res/screen-size-normal/IDL_PANEL_BACKGROUND_BUTTON_ITEM.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + diff --git a/Installer/res/screen-size-normal/IDL_PANEL_EXPANDABLE_ITEM.xml b/Installer/res/screen-size-normal/IDL_PANEL_EXPANDABLE_ITEM.xml new file mode 100644 index 0000000..03ab45a --- /dev/null +++ b/Installer/res/screen-size-normal/IDL_PANEL_EXPANDABLE_ITEM.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + diff --git a/Installer/res/screen-size-normal/workflow.xml b/Installer/res/screen-size-normal/workflow.xml new file mode 100644 index 0000000..dbe830f --- /dev/null +++ b/Installer/res/screen-size-normal/workflow.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/Installer/res/slk-SK.xml b/Installer/res/slk-SK.xml new file mode 100644 index 0000000..9bc0df7 --- /dev/null +++ b/Installer/res/slk-SK.xml @@ -0,0 +1,25 @@ + + + + Stiahnutá verzia: %ls + Žiadosti o povolenie + Zrušiť + Táto aplikácia môže byť škodlivá a poškodiť vaše zariadenie alebo údaje + V zariadení je už nainštalovaná novšia verzia. Nahradí sa staršou verziou + Tento súbor nemožno nainštalovať. Tento formát je neplatný + Nainštalované + Aktualizovať + Varovanie + Otvoriť + Nepodarilo sa + Nedá sa nainštalovať. Nedostatok pamäte + V zariadení je už nainštalovaná staršia verzia. Aktualizuje sa + Nainštalovaná verzia: %ls + Povoliť a nainštalovať + Chyba + V zariadení je už nainštalovaná táto verzia. Preinštaluje sa + Inštaluje sa %ls... + Preinštalovať + diff --git a/Installer/res/slv-SI.xml b/Installer/res/slv-SI.xml new file mode 100644 index 0000000..f43a568 --- /dev/null +++ b/Installer/res/slv-SI.xml @@ -0,0 +1,25 @@ + + + + Prenesena različica: %ls + Zahteva za dovoljenje + Prekliči + Ta aplikacija je lahko škodljiva in lahko poškoduje vašo napravo ali podatke + V vaši napravi je že nameščena novejša različica. Zamenjana bo s starejšo različico + Te datoteke ni mogoče namestiti. Oblika zapisa je neveljavna + Nameščeno + Posodobi + Opozorilo + Odpri + Ni uspelo + Ni mogoče namestiti. Ni dovolj pomnilnika + V vaši napravi je že nameščena starejša različica. Posodobljena bo + Nameščena različica: %ls + Dovoli in namesti + Napaka + V vaši napravi je že nameščena ta različica. Nameščena bo znova + Nameščanje aplikacije %ls ... + Znova namesti + diff --git a/Installer/res/spa-ES.xml b/Installer/res/spa-ES.xml new file mode 100644 index 0000000..7d275d3 --- /dev/null +++ b/Installer/res/spa-ES.xml @@ -0,0 +1,25 @@ + + + + Versión descargada: %ls + Solicitudes de permiso + Cancelar + Esta aplicación puede ser dañina y causar daños en el dispositivo o los datos + Hay una versión más reciente instalada en el dispositivo. Se sustituirá con la versión anterior + No se puede instalar este archivo. El formato no es válido + Instalados + Actualizar + Aviso + Abrir + Error + No se puede instalar. No hay memoria suficiente + Hay una versión anterior instalada en el dispositivo. Se actualizará + Versión instalada: %ls + Permitir e instalar + Error + Esta versión ya está instalada en el dispositivo. Se volverá a instalar + Instalando %ls... + Volver a instalar + diff --git a/Installer/res/spa-MX.xml b/Installer/res/spa-MX.xml new file mode 100644 index 0000000..818a818 --- /dev/null +++ b/Installer/res/spa-MX.xml @@ -0,0 +1,25 @@ + + + + Versión descargada: %ls + Solicitudes de permisos + Cancelar + Esta aplicación puede ser dañina y dañar su dispositivo o datos + Hay una versión más reciente instalada en el dispositivo. Se reemplazará con la versión anterior + No se puede instalar este archivo. El formato no es válido + Instalado + Actualizar + Aviso + Abrir + Error + No se puede instalar. No hay memoria suficiente + Ya hay una versión anterior instalada en el dispositivo. Se actualizará + Versión instalada: %ls + Permitir e instalar + Error + Esta versión ya está instalada en el dispositivo. Se reinstalará + Instalando %ls... + Reinstalar + diff --git a/Installer/res/srp-RS.xml b/Installer/res/srp-RS.xml new file mode 100644 index 0000000..d4f2ce0 --- /dev/null +++ b/Installer/res/srp-RS.xml @@ -0,0 +1,25 @@ + + + + Preuzeta verzija: %ls + Zahtevi za dozvolu + Poništi + Ova aplikacija može da bude štetna i da ošteti tvoj uređaj i podatke + Novija verzija je već instalirana na vašem uređaju. Ona će biti zamenjena starijom verzijom + Nije moguće instalirati ovaj fajl. Format je nevažeći + Instalirano + Ažuriraj + Upozorenje + Otvori + Neuspešno + Nemoguće instalirati aplik. Nedovoljna memorija + Starija verzija je već instalirana na vašem uređaju. Ona će biti ažurirana + Instalirana verzija: %ls + Dozvoli i instaliraj + Greška + Ova verzija je već instalirana na tvom uređaju. Ona će biti ponovo instalirana + Instaliranje %ls... + Ponovo instaliraj + diff --git a/Installer/res/swe-SE.xml b/Installer/res/swe-SE.xml new file mode 100644 index 0000000..534b3d0 --- /dev/null +++ b/Installer/res/swe-SE.xml @@ -0,0 +1,25 @@ + + + + Hämtad version: %ls + Begäran om tillstånd + Avbryt + Det här programmet kan vara skadligt för enheten eller data + Det finns redan en nyare version installerad på enheten. Den kommer att ersättas med den äldre versionen + Det går inte att avinstallera den här filen. Formatet är ogiltigt + Installerad + Uppdatera + Varning + Öppna + Misslyckades + Det går inte att avinstallera. För lite minne + Det finns redan en äldre version installerad på enheten. Den kommer att uppdateras + Installerad version: %ls + Tillåt och installera + Fel + Den här versionen är redan installerad på enheten. Den kommer att installeras igen + Installerar %ls... + Ominstallera + diff --git a/Installer/res/tur-TR.xml b/Installer/res/tur-TR.xml new file mode 100644 index 0000000..ade4b4e --- /dev/null +++ b/Installer/res/tur-TR.xml @@ -0,0 +1,25 @@ + + + + İndirilen sürüm: %ls + İzin talepleri + İptal + Uygulama zararlı olabilir ve cihazınız veya verilerinize zarar verebilir + Yeni bir sürüm zaten cihazınıza yüklenmiş durumda. Eski sürüm ile değiştirilecek + Bu dosya yüklenemiyor. Geçersiz format + Yüklendi + Güncelle + Uyarı + Aç + Başarısız + Yüklenemiyor. Yeterli bellek yok + Eski bir sürüm zaten cihazınıza yüklenmiş durumda. Güncellenecek + Yüklenen sürüm: %ls + İzin ver ve yükle + Hata + Bu sürüm zaten cihazınıza yüklenmiş durumda. Yeniden yüklenecek + %ls kuruluyor... + Yeniden yükle + diff --git a/Installer/res/ukr-UA.xml b/Installer/res/ukr-UA.xml new file mode 100644 index 0000000..61995fe --- /dev/null +++ b/Installer/res/ukr-UA.xml @@ -0,0 +1,25 @@ + + + + Завантажена версія: %ls + Запити дозволу + Скасувати + Ця програма може пошкодити пристрій або дані + На пристрої вже встановлено новішу версію. Її буде замінено попередньою версією + Неможливо інсталювати цей файл. Невірний формат + Встановлено + Оновити + Попередження + Відкрити + Збій + Неможливо інсталювати. Недостатньо пам’яті + На пристрої вже встановлено попередню версію. Програму буде оновлено + Встановлена версія: %ls + Дозволити та інсталювати + Помилка + Цю версію вже встановлено на пристрої. Її буде встановлено повторно + Інсталяція %ls... + Повторно інсталювати + diff --git a/Installer/res/uzb-UZ.xml b/Installer/res/uzb-UZ.xml new file mode 100644 index 0000000..543831d --- /dev/null +++ b/Installer/res/uzb-UZ.xml @@ -0,0 +1,25 @@ + + + + Yuklab olingan versiya: %ls + Ruxsatnoma so‘rovlari + Bekor qilish + Ushbu ilova zararli bo‘lishi va qurilma yoki ma’lumotlaringizga zarar yetkazishi mumkin + Yangiroq versiya qurilmangizda oldindan o‘rnatilgan. U eskiroq versiya bilan almashtiriladi + Ushbu faylni o‘rnatib bo‘lmaydi. Format noto‘g‘ri + O‘rnatildi + Yangilash + Ogohlantirish + Ochish + Xato + O‘rnatib bo‘lmaydi. Xotira yetarli emas + Eskiroq versiya qurilmangizda oldindan o‘rnatilgan. U yangilanadi + O‘rnatilgan versiya: %ls + Ruxsat ber va o‘rnat + Xato + Ushbu versiya qurilmangizda oldindan o‘rnatilgan. U qayta o‘rnatiladi + %ls o‘rnatilmoqda... + Qayta o‘rnatish + diff --git a/Installer/res/zho-CN.xml b/Installer/res/zho-CN.xml new file mode 100644 index 0000000..2e8dc69 --- /dev/null +++ b/Installer/res/zho-CN.xml @@ -0,0 +1,25 @@ + + + + 已下载版本: %ls + 许可请求 + 取消 + 该应用程序可能有害并损坏您的设备或数据 + 您的设备上已安装较新的版本。其将替换为较旧的版本 + 无法安装该文件。格式无效 + 已安装 + 更新 + 警告 + 打开 + 失败 + 无法安装。内存不足 + 您的设备上已安装有较旧的版本。其将被更新 + 已安装版本: %ls + 允许并安装 + 出错 + 您的设备上已安装有该版本。其将被重新安装 + 正在安装 %ls… + 重新安装 + diff --git a/Installer/res/zho-HK.xml b/Installer/res/zho-HK.xml new file mode 100644 index 0000000..f95d87f --- /dev/null +++ b/Installer/res/zho-HK.xml @@ -0,0 +1,25 @@ + + + + 已下載的版本: %ls + 權限請求 + 取消 + 此應用程式可能有害並可能損害您的裝置或數據 + 較新的版本已安裝在您的裝置上。將以更舊的版本取代 + 無法安裝此檔案。格式無效 + 已安裝 + 更新 + 警告 + 開啟 + 失敗 + 無法安裝。記憶體不足。 + 更舊的版本已安裝在您的裝置上。將會更新 + 已安裝的版本: %ls + 允許並安裝 + 錯誤 + 此版本已安裝在您的裝置上。將會重新安裝 + 正在安裝 %ls + 重新安裝 + diff --git a/Installer/res/zho-SG.xml b/Installer/res/zho-SG.xml new file mode 100644 index 0000000..31a9159 --- /dev/null +++ b/Installer/res/zho-SG.xml @@ -0,0 +1,25 @@ + + + + 已下载版本: %ls + 许可请求 + 取消 + 该应用程序可能有害并损坏您的设备或数据 + 您的设备上已安装较新的版本。其将替换为较旧的版本 + 无法安装该文件。格式无效 + 已安装 + 更新 + 警告 + 打开 + 失败 + 无法安装。内存不足 + 您的设备上已安装有较旧的版本。其将被更新 + 已安装版本: %ls + 允许并安装 + 错误 + 您的设备上已安装有该版本。其将被重新安装 + 正在安装 %ls… + 重新安装 + diff --git a/Installer/res/zho-TW.xml b/Installer/res/zho-TW.xml new file mode 100644 index 0000000..73c5aa7 --- /dev/null +++ b/Installer/res/zho-TW.xml @@ -0,0 +1,25 @@ + + + + 已下載的版本: %ls + 權限請求 + 取消 + 此應用程式可能有害且可能損害您的裝置或資料 + 較新的版本已安裝在您的裝置上。將以更舊的版本取代 + 無法安裝此檔案。格式無效 + 已安裝 + 更新 + 警告 + 開啟 + 失敗 + 無法安裝。沒有足夠的記憶體 + 更舊的版本已安裝在您的裝置上。將會更新 + 已安裝的版本: %ls + 允許並安裝 + 錯誤 + 此版本已安裝在您的裝置上。將會重新安裝 + 正在安裝 %ls + 重新安裝 + diff --git a/Installer/shared/data/nofile.dummy b/Installer/shared/data/nofile.dummy new file mode 100644 index 0000000..e69de29 diff --git a/Installer/shared/res/screen-density-xhigh/mainmenu.png b/Installer/shared/res/screen-density-xhigh/mainmenu.png new file mode 100644 index 0000000000000000000000000000000000000000..9765b1bda7e5bddf0925555ab204b887a873bf24 GIT binary patch literal 57662 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 kZ}gYfNaCF}xV$|1>H6z0+kD(r); +} +#ifdef __cplusplus +} +#endif // __cplusplus diff --git a/Installer/src/IstDetailForm.cpp b/Installer/src/IstDetailForm.cpp new file mode 100644 index 0000000..588c11f --- /dev/null +++ b/Installer/src/IstDetailForm.cpp @@ -0,0 +1,522 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// 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. +// + +/** + * @file IstDetailForm.cpp + * @brief This file contains the implementation of DetailForm class, which acts as a + * application installer displaying a list of all the privilege description in the TPK file. + */ + +#include +#include +#include +#include +#include +#include +#include "AppResourceId.h" +#include "IstDetailForm.h" +#include "IstInstallerApp.h" + +using namespace Tizen::App; +using namespace Tizen::App::Package; +using namespace Tizen::Base; +using namespace Tizen::Base::Runtime; +using namespace Tizen::Base::Collection; +using namespace Tizen::Graphics; +using namespace Tizen::Io; +using namespace Tizen::Security; +using namespace Tizen::System; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; + +class BlankTableViewItem + : public TableViewItem +{ +public: + result OnDraw(void) + { + return E_SUCCESS; + }; +}; + +DetailForm::DetailForm(void) + : __pPrivilegeList(null) + , __pExpandCloseIcon(null) + , __pExpandOpenIcon(null) + , __pExposedItemList(null) + , __fontSize(44.f) + , __childFontSize(32.f) +{ +} + +DetailForm::~DetailForm(void) +{ +} + +result +DetailForm::Initialize(void) +{ + return Construct(IDL_DETAIL_FORM); +} + +result +DetailForm::OnInitializing(void) +{ + result r = E_SUCCESS; + + SetFormBackEventListener(this); + AddOrientationEventListener(*this); + + String fontSizeString; + SettingInfo::GetValue(L"http://tizen.org/setting/font.size", fontSizeString); + __fontSize = UiConfiguration::GetFontSize(fontSizeString); + __childFontSize = __fontSize * 0.8f; + + SectionTableView* pSectionTableView = static_cast(GetControl(IDC_SECTIONTABLEVIEW)); + pSectionTableView->SetItemProviderF(this); + pSectionTableView->AddSectionTableViewItemEventListener(*this); + + AppResource* pAppResource = AppResource::GetInstance(); + __pExpandCloseIcon = pAppResource->GetBitmapN(L"00_button_expand_closed.png"); + __pExpandOpenIcon = pAppResource->GetBitmapN(L"00_button_expand_opened.png"); + + return r; +} + +result +DetailForm::OnTerminating(void) +{ + RemoveOrientationEventListener(*this); + delete __pPrivilegeList; + delete __pExpandCloseIcon; + delete __pExpandOpenIcon; + delete[] __pExposedItemList; + return E_SUCCESS; +} + +void +DetailForm::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + switch (actionId) + { + case IDA_BUTTON_INSTALL: + { + String filePath = static_cast(UiApp::GetInstance())->GetPackageFilePath(); + AppControl* pAc = AppManager::GetInstance()->FindAppControlN(AppId(L"D7eOJquGtL.InstallerService"), L""); + result r = pAc->Start(&filePath, null, null, null); + AppLogExceptionIf(IsFailed(r), "[%s] Failed to launch service app.", GetErrorMessage(r)); + UiApp::GetInstance()->Terminate(); + break; + } + } +} + +void +DetailForm::OnFormBackRequested(Tizen::Ui::Controls::Form& source) +{ + UiApp::GetInstance()->Terminate(); +} + +void +DetailForm::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("Enter"); + const PackageInfo* pPackageInfo = static_cast(UiApp::GetInstance())->GetPackageInfo(); + + IList* pList = pPackageInfo->GetPrivilegeListN(); + if (pList) + { + __pPrivilegeList = new (std::nothrow) ArrayList(SingleObjectDeleter); + __pPrivilegeList->Construct(*pList); + + if (__pPrivilegeList->GetCount() > 0) + { + __pExposedItemList = new (std::nothrow) bool[__pPrivilegeList->GetCount()]; + for (int i=0; i<__pPrivilegeList->GetCount(); ++i) + { + __pExposedItemList[i] = false; + } + } + } + + PackageAppInfo* pMainAppInfo = pPackageInfo->GetPackageAppInfoN(pPackageInfo->GetMainAppId()); + Bitmap* pAppIcon = pMainAppInfo->GetAppMenuIconN(); + + Header* pHeader = GetHeader(); + pHeader->SetTitleText(pPackageInfo->GetDisplayName()); + pHeader->SetTitleIcon(pAppIcon); + pHeader->Invalidate(false); + + delete pMainAppInfo; + delete pAppIcon; +} + +void +DetailForm::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ + AppLogDebug("Enter"); + delete __pPrivilegeList; + __pPrivilegeList = null; +} + +Tizen::Ui::Controls::TableViewItem* +DetailForm::CreateItem(int sectionIndex, int itemIndex, float itemWidth) +{ + CardLayout layout; + layout.Construct(); + + TableViewItem* pItem = null; + + switch (sectionIndex) + { + case 0: + { + String message; + AppResource::GetInstance()->GetString(IDS_APINST_BODY_THIS_APPLICATION_MAY_BE_HARMFUL_AND_DAMAGE_YOUR_DEVICE_OR_DATA, message); + + Font font; + font.Construct(FONT_STYLE_PLAIN, __childFontSize); + float textHeight = GetTextHeight(message, font, itemWidth - 32.f); + + BlankTableViewItem* pBlankItem = new (std::nothrow) BlankTableViewItem(); + pBlankItem->Construct(layout, FloatDimension(itemWidth, 40.f+textHeight)); + AccessibilityElement* pElement = pBlankItem->GetAccessibilityContainer()->GetElement(L"TableViewItem"); + if (pElement) + { + pElement->SetLabel(message); + } + + Label* pLabel = new (std::nothrow) Label(); + pLabel->Construct(FloatRectangle(0, 0, 0, 0), message); + pLabel->SetTextConfig(__childFontSize, LABEL_TEXT_STYLE_NORMAL); + pLabel->SetTextColor(Color(128, 128, 128)); + pLabel->SetTextHorizontalAlignment(ALIGNMENT_LEFT); + pLabel->GetAccessibilityContainer()->RemoveAllElements(); + + pItem = pBlankItem; + pItem->AddControl(pLabel); + break; + } + case 1: + { + int privilegeIndex = 0; + bool isTitle = GetPrivilegeListIndex(itemIndex, privilegeIndex); + + PrivilegeInfo* pInfo = static_cast(__pPrivilegeList->GetAt(privilegeIndex)); + + if (isTitle) + { + Font font; + font.Construct(FONT_STYLE_PLAIN, __fontSize); + float textHeight = GetTextHeight(L" ", font, itemWidth - 32.f); + + pItem = new (std::nothrow) TableViewItem(); + pItem->Construct(layout, FloatDimension(itemWidth, 87.f+textHeight)); + AccessibilityElement* pElement = pItem->GetAccessibilityContainer()->GetElement(L"TableViewItem"); + if (pElement) + { + pElement->SetLabel(pInfo->GetDisplayName()); + } + + Panel* pPanel = new (std::nothrow) Panel(); + pPanel->Construct(IDL_PANEL_EXPANDABLE_ITEM); + + if (__pExposedItemList[privilegeIndex] == true) + { + pItem->SetName(L"Exposed"); + Label* pIconLabel = static_cast(pPanel->GetControl(IDC_LABEL_EX)); + pIconLabel->SetBackgroundBitmap(*__pExpandOpenIcon); + pIconLabel->GetAccessibilityContainer()->RemoveAllElements(); + + } + else + { + pItem->SetName(L"Collapsed"); + Label* pIconLabel = static_cast(pPanel->GetControl(IDC_LABEL_EX)); + pIconLabel->SetBackgroundBitmap(*__pExpandCloseIcon); + pIconLabel->GetAccessibilityContainer()->RemoveAllElements(); + } + + Label* pMainLabel = static_cast(pPanel->GetControl(IDC_LABEL_MAIN_TEXT)); + pMainLabel->SetText(pInfo->GetDisplayName()); + pMainLabel->SetTextConfig(__fontSize, LABEL_TEXT_STYLE_NORMAL); + pMainLabel->GetAccessibilityContainer()->RemoveAllElements(); + + Label* pSubLabel = static_cast(pPanel->GetControl(IDC_LABEL_SUB_TEXT)); + pSubLabel->SetText(pInfo->GetDescription()); + pSubLabel->GetAccessibilityContainer()->RemoveAllElements(); + + pItem->AddControl(pPanel); + } + else + { + String labelText = pInfo->GetDisplayName(); + labelText.Append(L"\n\n"); + labelText.Append(pInfo->GetDescription()); + Font font; + font.Construct(FONT_STYLE_PLAIN, __childFontSize); + float textHeight = GetTextHeight(labelText, font, itemWidth - 32.f); + + pItem = new (std::nothrow) TableViewItem(); + pItem->Construct(layout, FloatDimension(itemWidth, 40.f+textHeight)); + pItem->SetBackgroundColor(Color(220, 218, 211), TABLE_VIEW_ITEM_DRAWING_STATUS_NORMAL); + pItem->SetBackgroundColor(Color(220, 218, 211), TABLE_VIEW_ITEM_DRAWING_STATUS_PRESSED); + AccessibilityElement* pElement = pItem->GetAccessibilityContainer()->GetElement(L"TableViewItem"); + if (pElement) + { + pElement->SetLabel(labelText); + } + + Label* pLabel = new (std::nothrow) Label(); + pLabel->Construct(FloatRectangle(0, 0, 0, 0), labelText); + pLabel->SetTextConfig(__childFontSize, LABEL_TEXT_STYLE_NORMAL); + pLabel->SetTextHorizontalAlignment(ALIGNMENT_LEFT); + pLabel->GetAccessibilityContainer()->RemoveAllElements(); + + pItem->AddControl(pLabel); + } + break; + } + case 2: + { + BlankTableViewItem* pBlankItem = new (std::nothrow) BlankTableViewItem(); + pBlankItem->Construct(layout, FloatDimension(itemWidth, 144.f)); + pBlankItem->GetAccessibilityContainer()->RemoveAllElements(); + + Panel* pPanel = new (std::nothrow) Panel(); + pPanel->Construct(IDL_PANEL_BACKGROUND_BUTTON_ITEM); + + Button* pButton =static_cast(pPanel->GetControl(IDC_BUTTON_INSTALL)); + pButton->AddActionEventListener(*this); + pButton->SetActionId(IDA_BUTTON_INSTALL); + + pItem = pBlankItem; + pItem->AddControl(pPanel); + break; + } + } + + return pItem; +} + +bool +DetailForm::DeleteItem(int sectionIndex, int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + delete pItem; + return true; +} + +float +DetailForm::GetDefaultItemHeight(void) +{ + return 0.f; +} + +int +DetailForm::GetItemCount(int sectionIndex) +{ + switch (sectionIndex) + { + case 0: + return 1; + case 1: + if (__pPrivilegeList) + { + return __pPrivilegeList->GetCount(); + } + else + { + return 0; + } + case 2: + return 1; + default: + return 0; + } +} + +int +DetailForm::GetSectionCount(void) +{ + return 3; +} + +Tizen::Base::String +DetailForm::GetSectionFooter(int sectionIndex) +{ + return L""; +} + +Tizen::Base::String +DetailForm::GetSectionHeader(int sectionIndex) +{ + String header; + switch (sectionIndex) + { + case 0: + AppResource::GetInstance()->GetString(IDS_APINST_HEADER_WARNING, header); + break; + case 1: + AppResource::GetInstance()->GetString(IDS_APINST_HEADER_PERMISSION_REQUESTS_ABB, header); + break; + } + return header; +} + +bool +DetailForm::HasSectionFooter(int sectionIndex) +{ + return false; +} + +bool +DetailForm::HasSectionHeader(int sectionIndex) +{ + switch (sectionIndex) + { + case 1: + return (__pPrivilegeList && __pPrivilegeList->GetCount() > 0); + case 2: + return false; + default: + return true; + } +} + +void +DetailForm::UpdateItem(int sectionIndex, int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + switch (sectionIndex) + { + case 0: + { + String message; + AppResource::GetInstance()->GetString(IDS_APINST_BODY_THIS_APPLICATION_MAY_BE_HARMFUL_AND_DAMAGE_YOUR_DEVICE_OR_DATA, message); + + Font font; + font.Construct(FONT_STYLE_PLAIN, __childFontSize); + float textHeight = GetTextHeight(message, font, pItem->GetWidthF() - 32.f); + pItem->SetSize(FloatDimension(pItem->GetWidthF(), 40.f+textHeight)); + break; + } + case 1: + { + int privilegeIndex = 0; + bool isTitle = GetPrivilegeListIndex(itemIndex, privilegeIndex); + if (!isTitle) + { + PrivilegeInfo* pInfo = static_cast(__pPrivilegeList->GetAt(privilegeIndex)); + + Font font; + font.Construct(FONT_STYLE_PLAIN, __childFontSize); + + String labelText = pInfo->GetDisplayName(); + labelText.Append(L"\n\n"); + labelText.Append(pInfo->GetDescription()); + + float textHeight = GetTextHeight(labelText, font, pItem->GetWidthF() - 32.f); + pItem->SetSize(pItem->GetWidthF(), 40.f+textHeight); + } + break; + } + } +} + +void +DetailForm::OnSectionTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::SectionTableView& tableView, int sectionIndex, int itemIndex, Tizen::Ui::Controls::TableViewContextItem* pContextItem, bool activated) +{ +} + +void +DetailForm::OnSectionTableViewItemStateChanged(Tizen::Ui::Controls::SectionTableView& tableView, int sectionIndex, int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem, Tizen::Ui::Controls::TableViewItemStatus status) +{ + String itemName = pItem->GetName(); + AppLogDebug("item: %ls", itemName.GetPointer()); + if (itemName == L"Collapsed") + { + Label* pLabel = static_cast(pItem->GetControl(IDC_LABEL_EX, true)); + pLabel->SetBackgroundBitmap(*__pExpandOpenIcon); + pLabel->Invalidate(false); + pItem->SetName(L"Exposed"); + + int privilegeIndex = 0; + GetPrivilegeListIndex(itemIndex, privilegeIndex); + __pExposedItemList[privilegeIndex] = true; + tableView.RefreshItem(sectionIndex, itemIndex+1, TABLE_VIEW_REFRESH_TYPE_ITEM_ADD); + } + else if (itemName == L"Exposed") + { + Label* pLabel = static_cast(pItem->GetControl(IDC_LABEL_EX, true)); + pLabel->SetBackgroundBitmap(*__pExpandCloseIcon); + pLabel->Invalidate(false); + pItem->SetName(L"Collapsed"); + + int privilegeIndex = 0; + GetPrivilegeListIndex(itemIndex, privilegeIndex); + __pExposedItemList[privilegeIndex] = false; + tableView.RefreshItem(sectionIndex, itemIndex+1, TABLE_VIEW_REFRESH_TYPE_ITEM_REMOVE); + } +} + +void +DetailForm::OnOrientationChanged(const Tizen::Ui::Control& source, Tizen::Ui::OrientationStatus orientationStatus) +{ + AppLogDebug("%d", orientationStatus); + SectionTableView* pSectionTableView = static_cast(GetControl(IDC_SECTIONTABLEVIEW)); + + pSectionTableView->RefreshItem(0, 0, TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY); + + int index = 0; + for (int i=0; iGetItemCountAt(1); ++i) + { + if (!GetPrivilegeListIndex(i, index)) + { + pSectionTableView->RefreshItem(1, i, TABLE_VIEW_REFRESH_TYPE_ITEM_MODIFY); + } + } +} + +bool +DetailForm::GetPrivilegeListIndex(int actualIndex, int& privilegeIndex) +{ + privilegeIndex = actualIndex; + int i = 0; + for (; iGetCount(); ++i) + { + if (__pExposedItemList[i] == true) + { + --privilegeIndex; + } + } + + return i == privilegeIndex; +} + +float +DetailForm::GetTextHeight(const Tizen::Base::String& text, const Tizen::Graphics::Font& font, float width) +{ + TextElement textElement; + textElement.Construct(text); + textElement.SetFont(font); + + EnrichedText enrichedText; + enrichedText.Construct(FloatDimension(width, 1.f)); + enrichedText.Add(textElement); + + return enrichedText.GetTotalLineHeightF(); +} diff --git a/Installer/src/IstFormFactory.cpp b/Installer/src/IstFormFactory.cpp new file mode 100644 index 0000000..db38b7c --- /dev/null +++ b/Installer/src/IstFormFactory.cpp @@ -0,0 +1,55 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// 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. +// + +/** + *@file IstFormFactory.cpp + *@brief This file contains the implementation FormFactory class, which manages + * all the forms of the application. + */ + +#include +#include "AppResourceId.h" +#include "IstFormFactory.h" +#include "IstDetailForm.h" + +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +FormFactory::FormFactory(void) +{ +} + +FormFactory::~FormFactory(void) +{ +} + +Tizen::Ui::Controls::Form* +FormFactory::CreateFormN(const Tizen::Base::String& formId, const Tizen::Ui::Scenes::SceneId& sceneId) +{ + AppLogDebug("SceneId: %ls", formId.GetPointer()); + SceneManager* pSceneManager = SceneManager::GetInstance(); + Form* pNewForm = null; + + if (formId == IDL_DETAIL_FORM) + { + DetailForm* pForm = new (std::nothrow) DetailForm(); + pForm->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pForm); + pNewForm = pForm; + } + + return pNewForm; +} diff --git a/Installer/src/IstInstalledPopup.cpp b/Installer/src/IstInstalledPopup.cpp new file mode 100644 index 0000000..bedba93 --- /dev/null +++ b/Installer/src/IstInstalledPopup.cpp @@ -0,0 +1,170 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// 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. +// + +/** + * @file InstalledPopup.cpp + * @brief This is the implementation file for InstalledPopup class. + */ + +#include +#include +#include +#include "AppResourceId.h" +#include "IstInstalledPopup.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; + +InstalledPopup::InstalledPopup() + : __pTarget(null) + , __isLaunchable(true) +{ +} + +InstalledPopup::~InstalledPopup() +{ +} + +result +InstalledPopup::Initialize(Tizen::Ui::Control* pTarget) +{ + result r = Construct(IDL_INSTALLED_POPUP); + if (IsFailed(r)) + { + AppLogException("[%s] Failed to construct popup.", GetErrorMessage(r)); + return r; + } + + __pTarget = pTarget; + + return r; +} + +result +InstalledPopup::RequestPopup(const Tizen::Base::String& appName, const Tizen::Base::String& installedVersion, + const Tizen::Base::String& downloadedVersion, bool isLaunchable) +{ + AppResource* pAppResource = AppResource::GetInstance(); + int compare = downloadedVersion.CompareTo(installedVersion); + if (compare > 0) + { + pAppResource->GetString(IDS_APINST_POP_AN_OLDER_VERSION_IS_ALREADY_INSTALLED_ON_YOUR_DEVICE_IT_WILL_BE_UPDATED, __installMessage); + + String buttonString; + pAppResource->GetString(IDS_APINST_BUTTON_UPDATE, buttonString); + static_cast(GetControl(IDC_BUTTON_REINSTALL, true))->SetText(buttonString); + } + else if (compare < 0) + { + pAppResource->GetString(IDS_APINST_POP_A_NEWER_VERSION_IS_ALREADY_INSTALLED_ON_YOUR_DEVICE_IT_WILL_BE_REPLACED_WITH_THE_OLDER_VERSION, __installMessage); + } + else + { + pAppResource->GetString(IDS_APINST_POP_THIS_VERSION_IS_ALREADY_INSTALLED_ON_YOUR_DEVICE_IT_WILL_BE_REINSTALLED, __installMessage); + } + + String version; + pAppResource->GetString(IDS_APINST_BODY_INSTALLED_VERSION_C_ABB, version); + version.Format(version.GetLength() + installedVersion.GetLength(), version.GetPointer(), installedVersion.GetPointer()); + __versionMessage = version; + __versionMessage.Append(L"\n"); + + pAppResource->GetString(IDS_APINST_BODY_DOWNLOADED_VERSION_C_ABB, version); + version.Format(version.GetLength() + downloadedVersion.GetLength(), version.GetPointer(), downloadedVersion.GetPointer()); + __versionMessage.Append(version); + + __isLaunchable = isLaunchable; + + SetShowState(true); + return Show(); +} + +result +InstalledPopup::OnInitializing(void) +{ + AppLogDebug("Enter"); + SetPropagatedKeyEventListener(this); + + Label* pMessage = static_cast(GetControl(IDC_LABEL_MESSAGE)); + pMessage->SetText(__installMessage); + + Label* pVersionInfo = static_cast(GetControl(IDC_LABEL_VERSION)); + pVersionInfo->SetText(__versionMessage); + + Button* pReInstallButton = static_cast(GetControl(IDC_BUTTON_REINSTALL, true)); + pReInstallButton->SetActionId(IDA_BUTTON_REINSTALL); + pReInstallButton->AddActionEventListener(*this); + + Button* pLaunchButton = static_cast(GetControl(IDC_BUTTON_LAUNCH, true)); + pLaunchButton->SetActionId(IDA_BUTTON_LAUNCH); + pLaunchButton->AddActionEventListener(*this); + + Button* pCancelButton = static_cast(GetControl(IDC_BUTTON_CANCEL, true)); + pCancelButton->SetActionId(IDA_BUTTON_CANCEL); + pCancelButton->AddActionEventListener(*this); + + if (!__isLaunchable) + { + GridLayout* pLayout = static_cast(static_cast(GetControl(IDC_PANEL))->GetLandscapeLayoutN()); + pLayout->SetColumnCollapsed(2, true); + pLayout->Update(); + delete pLayout; + pLayout = static_cast(static_cast(GetControl(IDC_PANEL))->GetPortraitLayoutN()); + pLayout->SetColumnCollapsed(2, true); + pLayout->Update(); + delete pLayout; + } + + return E_SUCCESS; +} + +result +InstalledPopup::OnTerminating(void) +{ + AppLogDebug("Enter"); + SetPropagatedKeyEventListener(null); + return E_SUCCESS; +} + +void +InstalledPopup::OnActionPerformed(const Control& source, int actionId) +{ + SetShowState(false); + + if (__pTarget) + { + __pTarget->SendUserEvent(actionId, null); + } +} + +bool +InstalledPopup::OnKeyReleased(Tizen::Ui::Control &source, const Tizen::Ui::KeyEventInfo &keyEventInfo) +{ + AppLogDebug("%d", keyEventInfo.GetKeyCode()); + if (keyEventInfo.GetKeyCode() == KEY_BACK || keyEventInfo.GetKeyCode() == KEY_ESC) + { + SetShowState(false); + if (__pTarget) + { + __pTarget->SendUserEvent(IDA_BUTTON_CANCEL, null); + } + } + + return false; +} diff --git a/Installer/src/IstInstallerApp.cpp b/Installer/src/IstInstallerApp.cpp new file mode 100644 index 0000000..0bdf19b --- /dev/null +++ b/Installer/src/IstInstallerApp.cpp @@ -0,0 +1,123 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// 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. +// + +/** + * @file IstInstallerApp.cpp + * @brief This file contains the declaration of InstallerApp Class, + * which provides basic features necessary to define an UiApp. + */ + +#include "IstInstallerApp.h" +#include "IstMainFrame.h" +#include "AppResourceId.h" + +using namespace Tizen::App; +using namespace Tizen::App::Package; +using namespace Tizen::Base; +using namespace Tizen::Ui::Controls; + +InstallerApp::InstallerApp(void) + : __pPackageInfo(null) +{ +} + +InstallerApp::~InstallerApp(void) +{ +} + +Tizen::App::UiApp* +InstallerApp::CreateInstance(void) +{ + return new (std::nothrow) InstallerApp(); +} + +const Tizen::App::Package::PackageInfo* +InstallerApp::GetPackageInfo(void) const +{ + return __pPackageInfo; +} + +Tizen::Base::String +InstallerApp::GetPackageFilePath(void) const +{ + return __packageFilePath; +} + + +bool +InstallerApp::OnAppInitializing(Tizen::App::AppRegistry& appRegistry) +{ + AppControlProviderManager::GetInstance()->SetAppControlProviderEventListener(this); + + return true; +} + +bool +InstallerApp::OnAppInitialized(void) +{ + MainFrame* pMainFrame = new (std::nothrow) MainFrame(); + pMainFrame->Construct(); + result r = AddFrame(*pMainFrame); + if (IsFailed(r)) + { + return false; + } + else + { + return true; + } +} + +bool +InstallerApp::OnAppTerminating(AppRegistry& appRegistry, bool forcedTermination) +{ + return true; +} + +void +InstallerApp::OnBackground(void) +{ + AppLogDebug("Enter"); + Terminate(); +} + +void +InstallerApp::OnAppControlRequestReceived(RequestId reqId, const Tizen::Base::String& operationId, + const Tizen::Base::String* pUriData, const Tizen::Base::String* pMimeType, const Tizen::Base::Collection::IMap* pExtraData) +{ + if (pExtraData) + { + const String* pFilePath = static_cast(pExtraData->GetValue(String(L"http://tizen.org/appcontrol/data/notification"))); + if (pFilePath) + { + __packageFilePath = *pFilePath; + } + } + else if (!pUriData || !pUriData->StartsWith(L"file://", 0)) + { + AppLogException("Invalid URI date."); + return; + } + else + { + __packageFilePath = *pUriData; + __packageFilePath.Replace(L"file://", L""); + } + + AppLogDebug("file path: %ls", __packageFilePath.GetPointer()); + __pPackageInfo = PackageManager::GetInstance()->GetPackageInfoFromFileN(__packageFilePath); + AppLogExceptionIf(GetLastResult() != E_SUCCESS, "[%s] Failed to get package information - %ls", GetErrorMessage(GetLastResult()), __packageFilePath.GetPointer()); +} diff --git a/Installer/src/IstMainFrame.cpp b/Installer/src/IstMainFrame.cpp new file mode 100644 index 0000000..9aaaed0 --- /dev/null +++ b/Installer/src/IstMainFrame.cpp @@ -0,0 +1,129 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// 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. +// + +/** + * @file IstMainFrame.cpp + * @brief This file contains implementation of MainFrame class, which is the main frame of the application. + */ + +#include +#include +#include +#include +#include "AppResourceId.h" +#include "IstMainFrame.h" +#include "IstInstallerApp.h" +#include "IstFormFactory.h" + +using namespace Tizen::App; +using namespace Tizen::App::Package; +using namespace Tizen::Base; +using namespace Tizen::Graphics; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +MainFrame::MainFrame(void) + : __pInstalledPopup(null) +{ +} + +MainFrame::~MainFrame(void) +{ +} + +result +MainFrame::OnInitializing(void) +{ + AppLogDebug("Enter"); + result r = E_SUCCESS; + SetOrientation(Tizen::Ui::ORIENTATION_AUTOMATIC); + + const PackageInfo* pPackageInfo = static_cast(UiApp::GetInstance())->GetPackageInfo(); + if (!pPackageInfo) + { + SetBackgroundColor(Color(0, 0, 0, 0)); + MessageBox msgBox; + String error, errorMsg; + AppResource* pAppResource = AppResource::GetInstance(); + pAppResource->GetString(IDS_PB_POP_ERROR, error); + pAppResource->GetString(IDS_APINST_POP_UNABLE_TO_INSTALL_THIS_FILE_THE_FORMAT_IS_INVALID, errorMsg); + + msgBox.Construct(error, errorMsg, MSGBOX_STYLE_OK, 10000); + int modal; + msgBox.ShowAndWait(modal); + return E_FAILURE; + } + + SceneManager* pSceneManager = SceneManager::GetInstance(); + pSceneManager->RegisterFormFactory(*new (std::nothrow) FormFactory()); + pSceneManager->RegisterScene("workflow"); + + __pInstalledPopup = new (std::nothrow) InstalledPopup(); + __pInstalledPopup->Initialize(this); + + PackageId packageId = pPackageInfo->GetId(); + __mainAppId = pPackageInfo->GetMainAppId(); + + PackageManager* pPackageManager = PackageManager::GetInstance(); + if (pPackageManager->IsPackageInstalled(packageId)) + { + SetBackgroundColor(Color(0, 0, 0, 0)); + String displayName = pPackageInfo->GetDisplayName(); + AppLogDebug("%ls: It has been already installed.", displayName.GetPointer()); + PackageInfo* pInstalledPackageInfo = pPackageManager->GetPackageInfoN(packageId); + r = __pInstalledPopup->RequestPopup(displayName, pInstalledPackageInfo->GetVersion(), + pPackageInfo->GetVersion(), false); + delete pInstalledPackageInfo; + } + else + { + r = pSceneManager->GoForward(SceneTransitionId(ID_SCNT_DETAIL_SCENE)); + } + + return r; +} + +result +MainFrame::OnTerminating(void) +{ + if (__pInstalledPopup) + { + __pInstalledPopup->Destroy(); + } + + return E_SUCCESS; +} + +void +MainFrame::OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs) +{ + AppLogDebug("Enter"); + switch (requestId) + { + case IDA_BUTTON_REINSTALL: + SceneManager::GetInstance()->GoForward(SceneTransitionId(ID_SCNT_DETAIL_SCENE)); + break; + case IDA_BUTTON_LAUNCH: + { + result r = AppManager::GetInstance()->LaunchApplication(__mainAppId); + AppLogExceptionIf(IsFailed(r), "[%s] Failed to launch application. - %ls", GetErrorMessage(r), __mainAppId.GetPointer()); + break; + } + default: + UiApp::GetInstance()->Terminate(); + break; + } +} diff --git a/InstallerService/.cproject b/InstallerService/.cproject new file mode 100644 index 0000000..4cde1e9 --- /dev/null +++ b/InstallerService/.cproject @@ -0,0 +1,450 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/InstallerService/.project b/InstallerService/.project new file mode 100644 index 0000000..88fbacf --- /dev/null +++ b/InstallerService/.project @@ -0,0 +1,99 @@ + + + InstallerService + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + ?name? + + + + org.eclipse.cdt.make.core.append_environment + true + + + org.eclipse.cdt.make.core.autoBuildTarget + all + + + org.eclipse.cdt.make.core.buildArguments + + + + org.eclipse.cdt.make.core.buildCommand + sbi-make + + + org.eclipse.cdt.make.core.buildLocation + ${workspace_loc:/InstallerService/Debug} + + + org.eclipse.cdt.make.core.cleanBuildTarget + clean + + + org.eclipse.cdt.make.core.contents + org.eclipse.cdt.make.core.activeConfigSettings + + + org.eclipse.cdt.make.core.enableAutoBuild + true + + + org.eclipse.cdt.make.core.enableCleanBuild + true + + + org.eclipse.cdt.make.core.enableFullBuild + true + + + org.eclipse.cdt.make.core.fullBuildTarget + all + + + org.eclipse.cdt.make.core.stopOnError + true + + + org.eclipse.cdt.make.core.useDefaultBuildCmd + true + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + org.tizen.nativecpp.apichecker.core.builder + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + org.tizen.nativecpp.apichecker.core.tizenCppNature + + + + 1360216703005 + + 26 + + org.eclipse.ui.ide.multiFilter + 1.0-projectRelativePath-matches-false-false-*/.tpk + + + + diff --git a/InstallerService/CMakeLists.txt b/InstallerService/CMakeLists.txt new file mode 100644 index 0000000..9811118 --- /dev/null +++ b/InstallerService/CMakeLists.txt @@ -0,0 +1,29 @@ +# Target name and AppID +SET(this_target InstallerService) +SET(PKG_ID D7eOJquGtL) + +# include directory +INCLUDE_DIRECTORIES( + /usr/include/osp + inc + ) + +# Source files +FILE(GLOB ${this_target}_SOURCE_FILES src/*.cpp) + +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIE") + +# Create executable +SET(CMAKE_EXECUTABLE_SUFFIX ".exe") +ADD_EXECUTABLE (${this_target} ${${this_target}_SOURCE_FILES}) + +# Set link libraries and link options +TARGET_LINK_LIBRARIES(${this_target} -L/usr/lib/osp osp-appfw osp-uifw osp-shell osp-shell-core pthread) +TARGET_LINK_LIBRARIES(${this_target} -Xlinker --allow-shlib-undefined -pthread -pie) + +# Copy info, data, res, and icons directories +INSTALL(TARGETS ${this_target} DESTINATION ../usr/apps/${PKG_ID}/bin) + +# Copy resource +INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/InstallerService/res DESTINATION ../usr/apps/${PKG_ID}) + diff --git a/InstallerService/inc/AppResourceId.h b/InstallerService/inc/AppResourceId.h new file mode 100644 index 0000000..bbf865b --- /dev/null +++ b/InstallerService/inc/AppResourceId.h @@ -0,0 +1,32 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// 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. +// + +/** + * @file AppResourceId.h + * @brief This is the header file for resource definition. + */ + +#ifndef _APP_RESOURCE_ID_H_ +#define _APP_RESOURCE_ID_H_ + +extern const wchar_t* IDC_LABEL_COUNT; +extern const wchar_t* IDC_LABEL_DEGREE; +extern const wchar_t* IDC_LABEL_ICON; +extern const wchar_t* IDC_LABEL_NAME; +extern const wchar_t* IDC_PROGRESS; +extern const wchar_t* IDL_QUICK_INSTALLATION; + +#endif // _APP_RESOURCE_ID_H_ diff --git a/InstallerService/inc/InstallerService.h b/InstallerService/inc/InstallerService.h new file mode 100644 index 0000000..126c76b --- /dev/null +++ b/InstallerService/inc/InstallerService.h @@ -0,0 +1,64 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// 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. +// + +/** + * @file InstallerService.h + * @brief This file contains the declaration of InstallerService Class, + * which provides basic features necessary to define an ServiceApp. + */ + +#ifndef _INSTALLER_SERVICE_H_ +#define _INSTALLER_SERVICE_H_ + +#include +#include +#include +#include +#include + +class InstallerServiceApp + : public Tizen::App::ServiceApp + , public virtual Tizen::App::IAppControlProviderEventListener + , public virtual Tizen::App::Package::IPackageInstallationEventListener +{ +public: + InstallerServiceApp(void); + virtual ~InstallerServiceApp(void); + result Install(const Tizen::Base::String& filePath); + + virtual bool OnAppInitializing(Tizen::App::AppRegistry& appRegistry); + virtual bool OnAppInitialized(void); + virtual bool OnAppTerminating(Tizen::App::AppRegistry& appRegistry, bool forcedTermination = false); + virtual void OnAppControlRequestReceived(RequestId reqId, const Tizen::Base::String& operationId, + const Tizen::Base::String* pUriData, const Tizen::Base::String* pMimeType, const Tizen::Base::Collection::IMap* pExtraData); + virtual void OnPackageInstallationCompleted(const Tizen::App::PackageId& packageId, Tizen::App::Package::PackageInstallationResult installationResult); + virtual void OnPackageInstallationInProgress(const Tizen::App::PackageId& packageId, int progress); + virtual void OnPackageUninstallationCompleted(const Tizen::App::PackageId& packageId, bool uninstallationResult); + + static Tizen::App::ServiceApp* CreateInstance(void); +private: + Tizen::App::PackageId __packageId; + Tizen::App::Package::PackageInfo* __pInfo; + Tizen::Ui::Controls::Label* __pDegreeLabel; + Tizen::Ui::Controls::Label* __pCountLabel; + Tizen::Ui::Controls::Progress* __pProgress; + Tizen::Shell::QuickPanelFrame* __pFrame; + Tizen::Base::Collection::ArrayList __filePathList; + Tizen::Locales::DateTimeFormatter* __pDateTimeFormatter; + int __index; +}; + +#endif // _INSTALLER_SERVICE_H_ diff --git a/InstallerService/manifest.xml b/InstallerService/manifest.xml new file mode 100644 index 0000000..aef8ef6 --- /dev/null +++ b/InstallerService/manifest.xml @@ -0,0 +1,31 @@ + + + LREqrkLatJ + 1.0.0 + C++App + + true + true + true + + + 2.2 + + http://tizen.org/privilege/packagemanager.info + http://tizen.org/privilege/package.info + http://tizen.org/privilege/notification + http://tizen.org/privilege/packagemanager.install + + + + + + InstallerService + + + mainmenu.png + + + + + diff --git a/InstallerService/res/screen-size-normal/IDL_QUICK_INSTALLATION.xml b/InstallerService/res/screen-size-normal/IDL_QUICK_INSTALLATION.xml new file mode 100644 index 0000000..31375cc --- /dev/null +++ b/InstallerService/res/screen-size-normal/IDL_QUICK_INSTALLATION.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + diff --git a/InstallerService/shared/res/screen-density-xhigh/mainmenu.png b/InstallerService/shared/res/screen-density-xhigh/mainmenu.png new file mode 100644 index 0000000000000000000000000000000000000000..9765b1bda7e5bddf0925555ab204b887a873bf24 GIT binary patch literal 57662 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 kZ}gYfNaCF}xV$|1>H6z0+kD +#include +#include +#include +#include +#include +#include "AppResourceId.h" +#include "InstallerService.h" + +using namespace Tizen::App::Package; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Graphics; +using namespace Tizen::Shell; +using namespace Tizen::System; +using namespace Tizen::Ui::Controls; + +InstallerServiceApp::InstallerServiceApp(void) + : __pInfo(null) + , __pDegreeLabel(null) + , __pCountLabel(null) + , __pProgress(null) + , __pFrame(null) + , __filePathList(SingleObjectDeleter) + , __pDateTimeFormatter(null) + , __index(0) +{ +} + +InstallerServiceApp::~InstallerServiceApp(void) +{ +} + +Tizen::App::ServiceApp* +InstallerServiceApp::CreateInstance(void) +{ + return new (std::nothrow) InstallerServiceApp(); +} + +bool +InstallerServiceApp::OnAppInitializing(Tizen::App::AppRegistry& appRegistry) +{ + AppLogDebug("Enter"); + Tizen::App::AppControlProviderManager::GetInstance()->SetAppControlProviderEventListener(this); + + __filePathList.Construct(); + + __pFrame = new (std::nothrow) QuickPanelFrame(); + __pFrame->Construct(IDL_QUICK_INSTALLATION); + + return true; +} + +bool +InstallerServiceApp::OnAppInitialized(void) +{ + AppLogDebug("Enter"); + TryReturn(__filePathList.GetCount() != 0, false, "The filePath is not exist."); + + __pDateTimeFormatter = Tizen::Locales::DateTimeFormatter::CreateTimeFormatterN(Tizen::Locales::DATE_TIME_STYLE_NONE); + String pattern; + SettingInfo::GetValue(L"http://tizen.org/setting/locale.time.format", pattern); + if (pattern.Contains(L":ss")) + { + pattern.Replace(L":ss", L""); + } + else if (pattern.Contains(L":SS")) + { + pattern.Replace(L":SS", L""); + } + else if (pattern.Contains(L".ss")) + { + pattern.Replace(L".ss", L""); + } + else if (pattern.Contains(L".SS")) + { + pattern.Replace(L".SS", L""); + } + else if (pattern.Contains(L"-ss")) + { + pattern.Replace(L"-ss", L""); + } + else if (pattern.Contains(L"-SS")) + { + pattern.Replace(L"-SS", L""); + } + __pDateTimeFormatter->ApplyPattern(pattern); + + __pCountLabel = static_cast(__pFrame->GetControl(IDC_LABEL_COUNT)); + __pDegreeLabel = static_cast(__pFrame->GetControl(IDC_LABEL_DEGREE)); + __pProgress = static_cast(__pFrame->GetControl(IDC_PROGRESS)); + + result r = Install(*static_cast(__filePathList.GetAt(__index))); + if (IsFailed(r)) + { + return false; + } + + return true; +} + +bool +InstallerServiceApp::OnAppTerminating(Tizen::App::AppRegistry& appRegistry, bool forcedTermination) +{ + AppLogDebug("Enter"); + delete __pFrame; + delete __pInfo; + delete __pDateTimeFormatter; + return true; +} + +void +InstallerServiceApp::OnAppControlRequestReceived(RequestId reqId, const Tizen::Base::String& operationId, + const Tizen::Base::String* pUriData, const Tizen::Base::String* pMimeType, const Tizen::Base::Collection::IMap* pExtraData) +{ + AppLogDebug("Enter"); + Tizen::App::AppId clientAppId = Tizen::App::AppControlProviderManager::GetInstance()->GetClientAppId(reqId); + TryReturnVoid(clientAppId == L"D7eOJquGtL.Installer", "[%ls] This application is not allowed.", clientAppId.GetPointer()); + TryReturnVoid(pUriData && pUriData->StartsWith(L"file://", 0), "There isn't URI data."); + + String filePath = *pUriData; + filePath.Replace(L"file://", L""); + __filePathList.Add(new (std::nothrow) String(filePath)); + + if (__pFrame->IsVisible()) + { + String count; + count.Format(10, L"%d/%d", __index+1, __filePathList.GetCount()); + + __pCountLabel->SetText(count); + __pCountLabel->Invalidate(false); + } +} + +void +InstallerServiceApp::OnPackageInstallationCompleted(const Tizen::App::PackageId& packageId, + Tizen::App::Package::PackageInstallationResult installationResult) +{ + AppLogDebug("Enter"); + TryReturnVoid(packageId == __packageId, "PackageId: %ls", packageId.GetPointer()); + PackageManager::GetInstance()->RemovePackageInstallationEventListener(*this); + + Tizen::App::AppId mainAppId = __pInfo->GetMainAppId(); + PackageAppInfo* pMainAppInfo = __pInfo->GetPackageAppInfoN(mainAppId); + String appName = __pInfo->GetDisplayName(); + + NotificationManager notificationManager; + notificationManager.Construct(); + + NotificationRequest request; + result r = request.SetIconFilePath(pMainAppInfo->GetAppMenuIconPath()); + AppLogDebugIf(IsFailed(r), "[%s] Failed to set app icon.", GetErrorMessage(r)); + + if (!pMainAppInfo->IsMenuIconVisible()) + { + AppLogDebug("This app hasn't a menu icon."); + mainAppId = L""; + } + + delete pMainAppInfo; + + String installTime; + DateTime curTime; + SystemTime::GetCurrentTime(TIME_MODE_WALL, curTime); + __pDateTimeFormatter->Format(curTime, installTime); + installTime.Insert(L"\n", 0); + installTime.Insert(appName, 0); + + request.SetAlertText(installTime); + + String titleText; + + switch (installationResult) + { + case PACKAGE_INSTALLATION_RESULT_SUCCESS: + AppLogDebug("PACKAGE_INSTALLATION_RESULT_SUCCESS"); + Tizen::App::AppResource::GetInstance()->GetString(L"IDS_APINST_POP_INSTALLED", titleText); + break; + case PACKAGE_INSTALLATION_RESULT_STORAGE_FULL: + AppLogDebug("PACKAGE_INSTALLATION_RESULT_STORAGE_FULL"); + Tizen::App::AppResource::GetInstance()->GetString(L"IDS_APINST_BODY_UNABLE_TO_INSTALL_NOT_ENOUGH_MEMORY_ABB", titleText); + break; + case PACKAGE_INSTALLATION_RESULT_INVALID_PACKAGE: + AppLogDebug("PACKAGE_INSTALLATION_RESULT_INVALID_PACKAGE"); + Tizen::App::AppResource::GetInstance()->GetString(L"IDS_APINST_POP_FAILED", titleText); + break; + } + + request.SetTitleText(titleText); + + if (installationResult != PACKAGE_INSTALLATION_RESULT_SUCCESS) + { + String* pFilePath = dynamic_cast(__filePathList.GetAt(__index)); + if (pFilePath) + { + request.SetAppMessage(*pFilePath); + } + mainAppId = L"D7eOJquGtL.Installer"; + } + + if (mainAppId.IsEmpty()) + { + r = notificationManager.Notify(request); + AppLogExceptionIf(IsFailed(r), "[%s] Failed to notify message.", GetErrorMessage(r)); + } + else + { + r = notificationManager.NotifyByAppId(mainAppId, request); + AppLogExceptionIf(IsFailed(r), "[%s] Failed to notify message.", GetErrorMessage(r)); + } + + String* pFilePath = null; + do + { + pFilePath = dynamic_cast(__filePathList.GetAt(++__index)); + if (pFilePath) + { + r = Install(*pFilePath); + if (r == E_SUCCESS) + { + return; + } + } + } while (pFilePath); + + __pFrame->SetShowState(false); + Terminate(); +} + +void +InstallerServiceApp::OnPackageInstallationInProgress(const Tizen::App::PackageId& packageId, int progress) +{ + AppLogDebug("progress: %d", progress); + TryReturnVoid(packageId == __packageId, "PackageId: %ls", packageId.GetPointer()); + + if (__pProgress->GetValue() != progress) + { + __pProgress->SetValue(progress); + __pProgress->Invalidate(false); + __pDegreeLabel->SetText(Integer::ToString(progress) + L"%"); + __pDegreeLabel->Invalidate(false); + } +} + +void +InstallerServiceApp::OnPackageUninstallationCompleted(const Tizen::App::PackageId& packageId, bool uninstallationResult) +{ + AppLogDebug("Enter"); + TryReturnVoid(packageId == __packageId, "PackageId: %ls", packageId.GetPointer()); +} + +result +InstallerServiceApp::Install(const Tizen::Base::String& filePath) +{ + AppLogDebug("Enter"); + NotificationManager notificationManager; + String count; + + delete __pInfo; + __pInfo = PackageManager::GetInstance()->GetPackageInfoFromFileN(filePath); + TryReturn(__pInfo, GetLastResult(), "[%s] Failed to get the packageInfo. - %ls", GetErrorMessage(GetLastResult()), filePath.GetPointer()); + __packageId = __pInfo->GetId(); + + PackageAppInfo* pMainAppInfo = __pInfo->GetPackageAppInfoN(__pInfo->GetMainAppId()); + Bitmap* pAppIcon = pMainAppInfo->GetAppMenuIconN(); + delete pMainAppInfo; + + String appName = __pInfo->GetDisplayName(); + + if (pAppIcon) + { + Label* pIconLabel = static_cast(__pFrame->GetControl(IDC_LABEL_ICON)); + pIconLabel->SetBackgroundBitmap(*pAppIcon); + delete pAppIcon; + } + + Label* pNameLabel = static_cast(__pFrame->GetControl(IDC_LABEL_NAME)); + pNameLabel->SetText(appName); + + String notifyTextMsg; + Tizen::App::AppResource::GetInstance()->GetString(L"IDS_APINST_BODY_INSTALLING_PS_ING", notifyTextMsg); + notifyTextMsg.Format(notifyTextMsg.GetLength() + appName.GetLength(), notifyTextMsg.GetPointer(), appName.GetPointer()); + + PackageManager::GetInstance()->AddPackageInstallationEventListener(*this); + result r = PackageManager::GetInstance()->InstallPackage(__packageId, filePath, null); + TryCatch(r == E_SUCCESS, , "[%s] Failed to install package.", GetErrorMessage(r)); + + notificationManager.Construct(); + notificationManager.NotifyTextMessage(notifyTextMsg); + + count.Format(10, L"%d/%d", __index+1, __filePathList.GetCount()); + __pCountLabel->SetText(count); + __pCountLabel->Invalidate(false); + + __pProgress->SetValue(0); + __pDegreeLabel->SetText(L"0%"); + + __pFrame->Invalidate(true); + __pFrame->SetShowState(true); + __pFrame->Show(); + + return r; + +CATCH: + delete __pInfo; + __pInfo = null; + return r; +} diff --git a/InstallerService/src/InstallerServiceEntry.cpp b/InstallerService/src/InstallerServiceEntry.cpp new file mode 100644 index 0000000..61725dc --- /dev/null +++ b/InstallerService/src/InstallerServiceEntry.cpp @@ -0,0 +1,50 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.1 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://floralicense.org/license/ +// +// 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 file contains the Tizen C++ application entry point. + */ + +#include "InstallerService.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; + +#ifdef __cplusplus +extern "C" +{ +#endif // __cplusplus + +_EXPORT_ int +OspMain(int argc, char* pArgv[]) +{ + AppLog("Application started."); + ArrayList args(SingleObjectDeleter); + args.Construct(); + for (int i = 0; i < argc; i++) + { + args.Add(new (std::nothrow) String(pArgv[i])); + } + + result r = Tizen::App::ServiceApp::Execute(InstallerServiceApp::CreateInstance, &args); + AppLogExceptionIf(IsFailed(r), "[%s] Application execution failed", GetErrorMessage(r)); + AppLog("Application finished."); + + return static_cast(r); +} +#ifdef __cplusplus +} +#endif // __cplusplus diff --git a/LICENSE.Flora b/LICENSE.Flora new file mode 100755 index 0000000..571fe79 --- /dev/null +++ b/LICENSE.Flora @@ -0,0 +1,206 @@ +Flora License + +Version 1.1, April, 2013 + +http://floralicense.org/license/ + +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. + +"Tizen Certified Platform" shall mean a software platform that complies +with the standards set forth in the Tizen Compliance Specification +and passes the Tizen Compliance Tests as defined from time to time +by the Tizen Technical Steering Group and certified by the Tizen +Association or its designated agent. + +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 +solely as incorporated into a Tizen Certified Platform, 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 solely +as incorporated into a Tizen Certified Platform 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 pursuant to the copyright license +above, in any medium, with or without modifications, and in Source or +Object form, provided that You meet the following conditions: + + 1. You must give any other recipients of the Work or Derivative Works + a copy of this License; and + 2. You must cause any modified files to carry prominent notices stating + that You changed the files; and + 3. 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 + 4. 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 + and your own copyright statement or terms and conditions do not conflict + the conditions stated in the License including section 3. + +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 Flora License to your work + +To apply the Flora 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 Flora License, Version 1.1 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://floralicense.org/license/ + + 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. + diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..94d56df --- /dev/null +++ b/NOTICE @@ -0,0 +1,3 @@ +Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved. +Except as noted, this software is licensed under Flora License, Version 1.1 +Please, see the LICENSE.Flora file for Flora License, Version 1.1 terms and conditions. diff --git a/manifest.xml b/manifest.xml new file mode 100644 index 0000000..de79cf1 --- /dev/null +++ b/manifest.xml @@ -0,0 +1,47 @@ + + + D7eOJquGtL + 1.0.0 + C++App + + + 2.2 + + http://tizen.org/privilege/packagemanager.info + http://tizen.org/privilege/package.info + http://tizen.org/privilege/application.launch + http://tizen.org/privilege/notification + http://tizen.org/privilege/packagemanager.install + + + + + + Installer + + + mainmenu.png + + + + application/vnd.tizen.package + application/vnd.wac.widget-sharing + application/widget + http://tizen.org/appcontrol/operation/view + + + + + + + + + InstallerService + + + mainmenu.png + + + + + diff --git a/packaging/apps.Installer.changes b/packaging/apps.Installer.changes new file mode 100644 index 0000000..4d0f66e --- /dev/null +++ b/packaging/apps.Installer.changes @@ -0,0 +1,7 @@ +* The July 5 2013 Changyong Jeon +- Supports translated languages. + +* The Jun 25 2013 Changyong Jeon +- fix issue that cutting some of description. + + diff --git a/packaging/apps.Installer.spec b/packaging/apps.Installer.spec new file mode 100755 index 0000000..7d16f38 --- /dev/null +++ b/packaging/apps.Installer.spec @@ -0,0 +1,65 @@ +Name: apps.Installer +Summary: Installer application +Version: 1.1.0 +Release: 1 +Group: TO_BE/FILLED_IN +License: Flora License, Version 1.1 +Source0: %{name}-%{version}.tar.gz +BuildRequires: cmake +BuildRequires: hash-signer +BuildRequires: pkgconfig(osp-appfw) +BuildRequires: pkgconfig(osp-uifw) +BuildRequires: pkgconfig(osp-shell) + +%description +Verification application: Installer + +%prep +%setup -q + +%build +MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'` +%ifarch %{ix86} +%if 0%{?simulator} +CXXFLAGS="$CXXFLAGS -D_OSP_DEBUG_ -D_OSP_X86_ -D_OSP_EMUL_" cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DFULLVER=%{version} -DMAJORVER=${MAJORVER} +%else +CXXFLAGS="$CXXFLAGS -D_OSP_DEBUG_ -D_OSP_X86_ " cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DFULLVER=%{version} -DMAJORVER=${MAJORVER} +%endif +%else +CXXFLAGS="$CXXFLAGS -D_OSP_DEBUG_ -D_OSP_ARMEL_" cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} -DFULLVER=%{version} -DMAJORVER=${MAJORVER} +%endif + +# Call make instruction with smp support +make %{?jobs:-j%jobs} + +%install +rm -rf %{buildroot} +mkdir -p %{buildroot}/usr/share/license +cp LICENSE.Flora %{buildroot}/usr/share/license/%{name} +%make_install + +# Application signing +PKG_ID=D7eOJquGtL +%define tizen_sign 1 +%define tizen_sign_base /usr/apps/${PKG_ID} +%define tizen_sign_level platform +%define tizen_author_sign 1 +%define tizen_dist_sign 1 + +%post +/sbin/ldconfig +PKG_ID=D7eOJquGtL +echo "/usr/etc/package-manager/backend/tpk -i /usr/apps/"${PKG_ID} +/usr/etc/package-manager/backend/tpk -i /usr/apps/${PKG_ID} +cp -f /usr/lib/osp/osp-service-app-loader /usr/apps/${PKG_ID}/bin/Installer + +%postun +/sbin/ldconfig +PKG_ID=D7eOJquGtL +echo "/usr/etc/package-manager/backend/tpk -u "${PKG_ID} +/usr/etc/package-manager/backend/tpk -u ${PKG_ID} + +%files +%defattr(-,root,root,-) +/usr/apps/* +/usr/share/license/%{name} -- 2.7.4