From 08b3b1074f28a49e3597577ca3dc1bae38160e63 Mon Sep 17 00:00:00 2001 From: Jinkun Jang Date: Sat, 16 Mar 2013 20:55:56 +0900 Subject: [PATCH] sync with master --- CMakeLists.txt | 32 ++ inc/IstDetailForm.h | 99 ++++ inc/IstFormFactory.h | 39 ++ inc/IstInstallEventListener.h | 43 ++ inc/IstInstallForm.h | 81 ++++ inc/IstInstallerApp.h | 66 +++ inc/IstMainFrame.h | 20 + inc/IstPanelFactory.h | 39 ++ inc/IstTypes.h | 54 +++ manifest.xml | 35 ++ packaging/apps.Installer.spec | 53 +++ res/.workflow | Bin 0 -> 5797 bytes .../00_button_radio_select.png | Bin 0 -> 3235 bytes .../00_button_radio_select_dim.png | Bin 0 -> 3231 bytes res/screen-density-xhigh/00_check_checking_dim.png | Bin 0 -> 3213 bytes res/screen-density-xhigh/00_icon_more.png | Bin 0 -> 3069 bytes res/screen-density-xhigh/00_icon_more_ef.png | Bin 0 -> 3314 bytes res/screen-density-xhigh/00_icon_more_press.png | Bin 0 -> 1570 bytes res/screen-density-xhigh/00_list_expand_closed.png | Bin 0 -> 3060 bytes .../00_list_expand_closed_press.png | Bin 0 -> 3098 bytes res/screen-density-xhigh/00_list_expand_opened.png | Bin 0 -> 3040 bytes .../00_list_expand_opened_press.png | Bin 0 -> 3032 bytes .../00_progress_pending_02_bg.png | Bin 0 -> 3458 bytes .../00_progress_pending_ef_02_bg.png | Bin 0 -> 4061 bytes res/screen-density-xhigh/00_time_picker_tail.png | Bin 0 -> 2990 bytes .../00_time_picker_tail_01.png | Bin 0 -> 3013 bytes res/screen-density-xhigh/alarm_type2.png | Bin 0 -> 2550 bytes res/screen-density-xhigh/home_type3.png | Bin 0 -> 1639 bytes res/screen-density-xhigh/message_type2.png | Bin 0 -> 2948 bytes res/screen-size-normal/IDL_APP_INSTALL_FORM.xml | 31 ++ res/screen-size-normal/IDL_DETAIL_FORM.xml | 33 ++ res/screen-size-normal/workflow.xml | 7 + shared/res/screen-density-xhigh/mainmenu.png | Bin 0 -> 17581 bytes src/InstallerEntry.cpp | 53 +++ src/IstDetailForm.cpp | 506 +++++++++++++++++++++ src/IstFormFactory.cpp | 60 +++ src/IstInstallEventListener.cpp | 80 ++++ src/IstInstallForm.cpp | 336 ++++++++++++++ src/IstInstallerApp.cpp | 167 +++++++ src/IstMainFrame.cpp | 41 ++ src/IstPanelFactory.cpp | 45 ++ src/IstTypes.cpp | 44 ++ 42 files changed, 1964 insertions(+) create mode 100755 CMakeLists.txt create mode 100644 inc/IstDetailForm.h create mode 100644 inc/IstFormFactory.h create mode 100644 inc/IstInstallEventListener.h create mode 100644 inc/IstInstallForm.h create mode 100644 inc/IstInstallerApp.h create mode 100644 inc/IstMainFrame.h create mode 100644 inc/IstPanelFactory.h create mode 100644 inc/IstTypes.h create mode 100644 manifest.xml create mode 100755 packaging/apps.Installer.spec create mode 100644 res/.workflow create mode 100644 res/screen-density-xhigh/00_button_radio_select.png create mode 100644 res/screen-density-xhigh/00_button_radio_select_dim.png create mode 100644 res/screen-density-xhigh/00_check_checking_dim.png create mode 100644 res/screen-density-xhigh/00_icon_more.png create mode 100644 res/screen-density-xhigh/00_icon_more_ef.png create mode 100644 res/screen-density-xhigh/00_icon_more_press.png create mode 100644 res/screen-density-xhigh/00_list_expand_closed.png create mode 100644 res/screen-density-xhigh/00_list_expand_closed_press.png create mode 100644 res/screen-density-xhigh/00_list_expand_opened.png create mode 100644 res/screen-density-xhigh/00_list_expand_opened_press.png create mode 100644 res/screen-density-xhigh/00_progress_pending_02_bg.png create mode 100644 res/screen-density-xhigh/00_progress_pending_ef_02_bg.png create mode 100644 res/screen-density-xhigh/00_time_picker_tail.png create mode 100644 res/screen-density-xhigh/00_time_picker_tail_01.png create mode 100644 res/screen-density-xhigh/alarm_type2.png create mode 100644 res/screen-density-xhigh/home_type3.png create mode 100644 res/screen-density-xhigh/message_type2.png create mode 100644 res/screen-size-normal/IDL_APP_INSTALL_FORM.xml create mode 100644 res/screen-size-normal/IDL_DETAIL_FORM.xml create mode 100644 res/screen-size-normal/workflow.xml create mode 100644 shared/res/screen-density-xhigh/mainmenu.png create mode 100644 src/InstallerEntry.cpp create mode 100644 src/IstDetailForm.cpp create mode 100644 src/IstFormFactory.cpp create mode 100644 src/IstInstallEventListener.cpp create mode 100644 src/IstInstallForm.cpp create mode 100644 src/IstInstallerApp.cpp create mode 100644 src/IstMainFrame.cpp create mode 100644 src/IstPanelFactory.cpp create mode 100644 src/IstTypes.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100755 index 0000000..c056ca0 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,32 @@ +# Target name and AppID +## TODO : set application name and PKG_ID +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 +## TODO : add more link libraries and options +TARGET_LINK_LIBRARIES(${this_target} -L/usr/lib/osp osp-appfw osp-uifw osp-media osp-image 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}/res DESTINATION ../usr/apps/${PKG_ID}) +INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/shared DESTINATION ../usr/apps/${PKG_ID}) diff --git a/inc/IstDetailForm.h b/inc/IstDetailForm.h new file mode 100644 index 0000000..600e34a --- /dev/null +++ b/inc/IstDetailForm.h @@ -0,0 +1,99 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://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 the implementation of IstDetailForm class, which acts as a + * application installer displaying a list of all the privilege description in the TPK file + * and install a package that can be consist of several application. + */ +#ifndef _IST_DETAIL_FORM_H_ +#define _IST_DETAIL_FORM_H_ + +#include +#include +#include + +class DetailForm + : public Tizen::Ui::Controls::Form + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::Controls::IGroupedTableViewItemEventListener + , public Tizen::Ui::Controls::IGroupedTableViewItemProvider + , public Tizen::Ui::Scenes::ISceneEventListener +{ + +// Construction +public: + DetailForm(void); + virtual ~DetailForm(void); + bool Initialize(); + void CreateTableView(void); + void ConfirmPopupOn(); + result GetInfoValue(int groupIndex, int itemIndex, Tizen::Base::String& name, Tizen::Base::String& description); + result ParsingTPK(); + result ResizeSubText(int lineCount, Tizen::Ui::Controls::TableViewItem* pItem, Tizen::Ui::Controls::TextBox* pSubTextBox); + void SetInfoTextBox(); + void SetListItemImage(Tizen::App::AppResource* pAppResource); + void SetPopupControl(); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + virtual void OnFormBackRequested(Form& source); + virtual void OnGroupedTableViewGroupItemStateChanged(Tizen::Ui::Controls::GroupedTableView& tableView, int groupIndex, Tizen::Ui::Controls::TableViewGroupItem* pItem, Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnGroupedTableViewItemStateChanged(Tizen::Ui::Controls::GroupedTableView& tableView, int groupIndex, int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem, Tizen::Ui::Controls::TableViewItemStatus status); + virtual void OnGroupedTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::GroupedTableView& tableView, int groupIndex, int itemIndex, Tizen::Ui::Controls::TableViewContextItem* pContextItem, bool activated); + virtual int GetGroupCount(void); + virtual int GetItemCount(int groupIndex); + virtual Tizen::Ui::Controls::TableViewGroupItem* CreateGroupItem(int groupIndex, int itemWidth); + virtual Tizen::Ui::Controls::TableViewItem* CreateItem(int groupIndex, int itemIndex, int itemWidth); + virtual bool DeleteGroupItem(int groupIndex, Tizen::Ui::Controls::TableViewGroupItem* pItem); + virtual void UpdateGroupItem(int groupIndex, Tizen::Ui::Controls::TableViewGroupItem* pItem); + virtual bool DeleteItem(int groupIndex, int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual void UpdateItem(int groupIndex, int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem); + virtual int GetDefaultGroupItemHeight(void); + virtual int GetDefaultItemHeight(void); + 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); + +private: + Tizen::Ui::Controls::Popup* __pPopup; + Tizen::Ui::Controls::TextBox* __pTextBox; + Tizen::Ui::Controls::ListView* __pInfoList; + Tizen::Ui::Controls::TableView* __pTableList; + Tizen::Ui::Controls::GroupedTableView* __pList; + Tizen::Ui::Controls::Label* __pShowAllImageLable; + Tizen::Ui::Controls::Label* __pPreInstallLabel; + Tizen::Graphics::Bitmap* __pHome; + Tizen::Graphics::Bitmap* __pHeaderImage; + Tizen::Graphics::Bitmap* __pDropDown; + Tizen::Graphics::Bitmap* __pDropDown2; + Tizen::Graphics::Bitmap* __pRollUp; + Tizen::Graphics::Bitmap* __pCheckImage; + + Tizen::App::Package::PackageInfo* __pTargetPackageInfo; + Tizen::Base::Collection::IList* __pPrivilegeList; + Tizen::Ui::Controls::Header* __pHeader; + + int __itemCount; + bool __isInstalled; + bool __isUpdatable; +}; + +#endif diff --git a/inc/IstFormFactory.h b/inc/IstFormFactory.h new file mode 100644 index 0000000..d4baacd --- /dev/null +++ b/inc/IstFormFactory.h @@ -0,0 +1,39 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://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 InstallServiceFormFactory class, which manages + *all the forms of the application. + */ + +#ifndef _IST_FORM_FACTORY_H_ +#define _IST_FORM_FACTORY_H_ + +#include + + +class FormFactory + : public 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/inc/IstInstallEventListener.h b/inc/IstInstallEventListener.h new file mode 100644 index 0000000..fea3ce2 --- /dev/null +++ b/inc/IstInstallEventListener.h @@ -0,0 +1,43 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://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: IstAppInstall.h + * @brief: This file contains the implementation of IstAppInstall class, which acts as a + * application installer processing a installation of application. This form also notify + * completion of installation to IstAppInstallForm. + */ + +#ifndef _IST_INSTALL_EVENT_LISTENER_H_ +#define _IST_INSTALL_EVENT_LISTENER_H_ + + +#include + +class InstallEventListener + : public Tizen::App::Package::IPackageInstallationResponseListener +{ +public: + InstallEventListener(); + virtual ~InstallEventListener(); + + // package install Response Listener + virtual void OnPackageInstallationResponseReceived(const Tizen::Base::String& packageId, + Tizen::App::Package::PackageInstallationResult installationResult); + virtual void OnPackageInstallationInProgressResponseReceived(const Tizen::Base::String& packageId, int progress); +}; + +#endif /* _IST_INSTALL_EVENT_LISTENER_H_ */ diff --git a/inc/IstInstallForm.h b/inc/IstInstallForm.h new file mode 100644 index 0000000..b5bc039 --- /dev/null +++ b/inc/IstInstallForm.h @@ -0,0 +1,81 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://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: IstAppInstallForm.h + * @brief: This file contains the implementation of IstAppInstallForm class, which acts as a + * application installer displaying a progress of installation of application. This form also open + * target application or close installer itself. + */ +#ifndef _IST_INSTALL_FORM_H_ +#define _IST_INSTALL_FORM_H_ + +#include +#include + +using namespace Tizen::Base::Runtime; + +class InstallForm + : public Tizen::Base::Runtime::ITimerEventListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::Controls::Form + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::Scenes::ISceneEventListener +{ + +public: + InstallForm(void); + virtual ~InstallForm(void); + bool Initialize(); + void AddFooterItem(); + void InstallApplication(); + void OnPopup(); + void SetPopupValueAndOn(Tizen::Base::String title, Tizen::Base::String content); + void SetPopupControl(); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnTimerExpired(Timer& timer); + virtual void OnUserEventReceivedN (RequestId requestId, Tizen::Base::Collection::IList *pArgs); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + virtual void OnFormBackRequested(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); +private: + int __timerCounter; + bool __isInstalling; + bool __isInstallSuccess; + + Timer* __pTimer; + Tizen::Ui::Controls::Header* __pHeader; + Tizen::Ui::Controls::Label* __pProgressLabel; + Tizen::Ui::Controls::Label* __progressImageLabel; + Tizen::Ui::Controls::Progress* __pProgress; + Tizen::Ui::Controls::Popup* __pPopup; + Tizen::Ui::Controls::TextBox* __pPopupTextBox; + + Tizen::Graphics::Bitmap* __pProgressImage; + Tizen::Graphics::Bitmap* __pProgressEfImage; + + Tizen::Base::String __packageOperationId; + Tizen::Base::String __packageName; + Tizen::App::AppManager* __pAppManager; + +}; + +#endif diff --git a/inc/IstInstallerApp.h b/inc/IstInstallerApp.h new file mode 100644 index 0000000..6d06d05 --- /dev/null +++ b/inc/IstInstallerApp.h @@ -0,0 +1,66 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://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 +#include + + + +class InstallerApp + : public Tizen::App::UiApp + , public Tizen::App::IAppControlProviderEventListener + , public Tizen::System::IScreenEventListener +{ +public: + static Tizen::App::UiApp* CreateInstance(void); + InstallerApp(void); + virtual~InstallerApp(void); + Tizen::Base::String GetPackagePath(); + bool IsValidAccess(); + + virtual bool OnAppInitializing(Tizen::App::AppRegistry& appRegistry); + virtual bool OnAppInitialized(void); + virtual bool OnAppWillTerminate(void); + virtual bool OnAppTerminating(Tizen::App::AppRegistry& appRegistry, bool forcedTermination = false); + virtual void OnForeground(void); + virtual void OnBackground(void); + virtual void OnLowMemory(void); + virtual void OnBatteryLevelChanged(Tizen::System::BatteryLevel batteryLevel); + 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 OnScreenOn(void); + virtual void OnScreenOff(void); + +private: + void SetUri(Tizen::Base::String uriData); + void SetPackagePath(Tizen::Base::String packagePath); + + bool __isValidAccess; +}; + +#endif // _IST_INSTALLER_APP_H_ diff --git a/inc/IstMainFrame.h b/inc/IstMainFrame.h new file mode 100644 index 0000000..a8e2f24 --- /dev/null +++ b/inc/IstMainFrame.h @@ -0,0 +1,20 @@ +#ifndef _IST_MAIN_FRAME_H_ +#define _IST_MAIN_FRAME_H_ + +#include +#include + + +class MainFrame + : public Tizen::Ui::Controls::Frame +{ +public: + MainFrame(void); + virtual ~MainFrame(void); + +public: + virtual result OnInitializing(void); + virtual result OnTerminating(void); +}; + +#endif //_IST_MAIN_FRAME_H_ diff --git a/inc/IstPanelFactory.h b/inc/IstPanelFactory.h new file mode 100644 index 0000000..b992ee2 --- /dev/null +++ b/inc/IstPanelFactory.h @@ -0,0 +1,39 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://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: IstPanelFactory.h + * @brief: This file contains the implementation of InstallServicePanelFactory class, which manages + * all the panel containers used across the application. + */ + +#ifndef _IST_PANEL_FACTORY_H_ +#define _IST_PANEL_FACTORY_H_ + +#include + + +class PanelFactory + : public Tizen::Ui::Scenes::IPanelFactory +{ +public: + PanelFactory(void); + virtual ~PanelFactory(void); + + virtual Tizen::Ui::Controls::Panel* CreatePanelN(const Tizen::Base::String& panelId, const Tizen::Ui::Scenes::SceneId& sceneId); +}; + +#endif // _IST_PANEL_FACTORY_H_ diff --git a/inc/IstTypes.h b/inc/IstTypes.h new file mode 100644 index 0000000..80d7f21 --- /dev/null +++ b/inc/IstTypes.h @@ -0,0 +1,54 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://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: IstTypes.h + * @brief: This file contains common enumerators, static constants used across the application + */ + +#ifndef _IST_TYPES_H_ +#define _IST_TYPES_H_ + +#include +#include + +using namespace Tizen::Graphics; + +static const int INSTALL_SUCCESS_EVENT = 2000; +static const int INSTALL_FAIL_STORAGE_FULL = 2001; +static const int INSTALL_FAIL_INVALID_PACKAGE = 2002; + +extern const wchar_t* HEADER_IMAGE; +extern const wchar_t* APP_NAME; +extern const wchar_t* FILE_URI_SCHEME; + +extern Tizen::Base::String __uriData; +extern Tizen::Base::String __packagePath; + +extern const int GAP_BETWEEN_FORM_POPUP; +extern const int X_POPUP_LABLE; +extern const int Y_POPUP_LABLE; +extern const int H_POPUP_LABLE; +extern const int GAP_BETWEEN_POPUP_LABEL; +extern const int GAP_BETWEEN_POPUP_BUTTON; +extern const int UI_H_POPUP; +extern const int UI_H_POPUP_BUTTON; +extern const int H_POPUP_TITLE; +extern const int H_TEXT_LINE; +extern const int GAP_BETWEEN_BUTTON; +extern const int X_CANCEL_BTN_ALONE; + +#endif /* _IST_TYPES_H_ */ diff --git a/manifest.xml b/manifest.xml new file mode 100644 index 0000000..39cf499 --- /dev/null +++ b/manifest.xml @@ -0,0 +1,35 @@ + + + D7eOJquGtL + 1.0.0 + C++App + + true + true + + + 2.0 + + http://tizen.org/privilege/application.launch + http://tizen.org/privilege/packageinfo + http://tizen.org/privilege/application.kill + http://tizen.org/privilege/packagemanager.install + + + + + + Installer + + + mainmenu.png + + + + http://tizen.org/appcontrol/operation/install + + + + + + diff --git a/packaging/apps.Installer.spec b/packaging/apps.Installer.spec new file mode 100755 index 0000000..ae657ee --- /dev/null +++ b/packaging/apps.Installer.spec @@ -0,0 +1,53 @@ +Name: apps.Installer +Summary: Installer application +Version: 1.0.1 +Release: 1 +Group: TO_BE/FILLED_IN +License: TO BE FILLED IN +Source0: %{name}-%{version}.tar.gz +BuildRequires: cmake +BuildRequires: pkgconfig(osp-appfw) +BuildRequires: pkgconfig(osp-uifw) +BuildRequires: pkgconfig(osp-media) +BuildRequires: pkgconfig(osp-image) +BuildRequires: pkgconfig(osp-image-core) + +%description +Verification application: Installer + +%prep +%setup -q + +%build +MAJORVER=`echo %{version} | awk 'BEGIN {FS="."}{print $1}'` +%ifarch %{ix86} +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_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} +%make_install + +%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/* + + diff --git a/res/.workflow b/res/.workflow new file mode 100644 index 0000000000000000000000000000000000000000..f41112cd922134aa9f132a46222b1526432a1d72 GIT binary patch literal 5797 zcmb_g&2Jk;6dyZInvX)7hN89tp%PU^Lh-6eo2H~3Tswu0wuu#+BIOcoyi;eJ_3UNmKoC@^=pJaGRwLl%b4V~WCmWcPZJCpm=0qM% z>m=2HZ?oY+=Olgs;rw9;%Ek_qv0Z9ccZE(y>$W9!CEP18V+-JBF}|`GU)dbzW)p*~ z@!-jepFB1{8zCt@@QqxOs%JtQt|XEvazaJe0MiNE#@UlR+9eCaXfWahp{^ z#IZm`L0(H1u5Dq5D1qXFtRzDzRVZsk?@ACKp?lPy6#Pp43m?g48v6qY8iLH|h3!&) zy}W%hr>~dttLv*6Vi+J-6N%GqM!0cM(mKnGLBNl=!%3Cq_%tRBKPK&)0%KnQh!y$t z4E*{BzCZQYt~$baLYz~L?p`30tQg#Id99}yKvBwY*R3VicoP*;`5q;n1Am|x+PvU#kf^9lZa+{3&Z?X@93DXhyflxb0teg>Y*InKrFECe#igGgogVcR8V`sKA>7}Eh2znl#qX=pVkLzY&BrRu$&0+OzqE+86;?m2~ zvB4%#XW(Qcq^!hw2v396nXA2Z2H{_lPypPO4fmiY;u5Pm%!;x>t{E&FaO+pq)`-#t zBgfk7etbtJ3^>GG?7)nZCZ3KUXZ3=yohuf%;cO}A3}gGo#^%krTw!f{0Sa?2Q8nxr zT#~CyW+H=0DLbOU(7V!pJV8$5H=cAX1@yvO*ks_O++aC*M=Mf(8_E)uDYGU~J3W^9^uPhFB|w`2>UC7FGyb{K|PC1j>;u%cPnGpkf*zAzmpxJ|JlcdMNG{wDQ3 zxSG;UTA}b#6U)1xtU3zbfloVmKT&pWR?(c=h0`4G-?Qfrv6`uERC(xqgX?3$J0b1~X1z>bB>ygpKN8E4U$+Pa#-g zwVc!2626OI8Y}qTkq~@8B-lSe=j9&5Cum<%%blu8QV))V)Q2Id#SQibclSMNmCYT8 z-m+;OuZ6TBbU|xakPc+F!ke_9`CWK138d{u`)TsCFYTp1v_C!)+MkECFZ9xuZa~t5 zP)(eiabbI<57n=ZgzDEJ)t7sz4$9I~h74GO;#e;9VfljsAEx?z7qUFJ!SG)KUGY1J zlA`nTRAxXt=Ce!~--wB_FE&ha}f^OOWLLR^Y>s`!ytY zwv*f-(tV>07?2$tk$nqJaBo+qBeF}4D)3?0{SmU8?P6D_p1`4bc|^{^0XW@ts^RFF zV2U79@^lQ&Jc-zQFv@OeGv35Uf_pZ0PGTdGu0^Y+<@j{hI6i)W&G*>+g3WK({E5vM U*gV4KBW&(t^ENhjv9TKe0cIzeuK)l5 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_button_radio_select.png b/res/screen-density-xhigh/00_button_radio_select.png new file mode 100644 index 0000000000000000000000000000000000000000..304d61b1f06d2d82dfc838a50d6e36932a4ab998 GIT binary patch literal 3235 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 TlvxIS-2$MiX{1pFv5WW*gC`Tk literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_button_radio_select_dim.png b/res/screen-density-xhigh/00_button_radio_select_dim.png new file mode 100644 index 0000000000000000000000000000000000000000..8e71cc0cfe245926e868e04b53f18ff4ba4131cf GIT binary patch literal 3231 zcmV;Q3}Ew#P)j{00009a7bBm000XU z000XU0RWnu7ytkYPiaF#P*7-ZbZ>KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0005XNklAbXWzGZpy*v4csVOHZAGaSMT zFTC)=3opFz!V53F@WKl(yzp7Y^Qv!XT$l%zfmg--&w*j|_IK5}G^(2685h=pF0k^C zONPK#AVzP8PXcdTXaQS5^MOl7Kr9}@b+-7T+8==zQ!GCL_M*3=>^^wLg*9M%N;p6V z_+(s|%L;E?cn$27uvHt_%&qe8A5ro9v0+?jW`Q>@w2O+Bnd7@$D&I}8=W5X()E?hS zRHRO=@y3NEV4gJ5tb64b680pEb;oCQP%1mw%Y?ZOYmJZI{sI0b!k_2xwf~j~f0_gS zOA2`LR@ECHy*&ngl)UX>PQ85(7?-qHKYBaJ1|PjW1NKYUY5;`n&hydRK5zg`JB|4c z>_%^|Qsr317^?$(0A4GJH7e@_!YhVS#^8c(C??h3opFz!V53F@WKl(yzs&cFTC)=3t#KF833mhc5y&{ RT6zEg002ovPDHLkV1fVu3i|*6 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_check_checking_dim.png b/res/screen-density-xhigh/00_check_checking_dim.png new file mode 100644 index 0000000000000000000000000000000000000000..4d5c28449439107fb39988b9671e6c4d910848d1 GIT binary patch literal 3213 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_icon_more.png b/res/screen-density-xhigh/00_icon_more.png new file mode 100644 index 0000000000000000000000000000000000000000..8e904815c574fd4279246fe3731d2ea2278e1a79 GIT binary patch literal 3069 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 LNkvXXu0mjfxi7>! literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_icon_more_ef.png b/res/screen-density-xhigh/00_icon_more_ef.png new file mode 100644 index 0000000000000000000000000000000000000000..3c8323aae253b996e1907361e65c03c13027696e GIT binary patch literal 3314 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_icon_more_press.png b/res/screen-density-xhigh/00_icon_more_press.png new file mode 100644 index 0000000000000000000000000000000000000000..3a135097366db9d6b268d59882d67e10cb32a046 GIT binary patch literal 1570 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 literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_list_expand_closed_press.png b/res/screen-density-xhigh/00_list_expand_closed_press.png new file mode 100644 index 0000000000000000000000000000000000000000..b421ad12c552e414a5c71024700a4cc030381dee GIT binary patch literal 3098 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 Cw8ESK literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/00_time_picker_tail.png b/res/screen-density-xhigh/00_time_picker_tail.png new file mode 100644 index 0000000000000000000000000000000000000000..eea39f7cafbbd67a7373d88251558ff4ee8424f5 GIT binary patch literal 2990 zcmV;f3sLlmP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0002lNklLsF8wCVwRhE{Edwyk=DXcZAX zLqw~#F??IpC^gO8+uY{I+1x)qmwP-wMNLTs&Tp8fK%Of9$2>J9tt2h1?*ir#K4Sl} zGPSvHi-m715u)!N6QeIX7evb)Cc21g%83KQ&yR^3;%M-sWj;)l5gUtNo#esh*i|S( z^z1P)w1ncE5e;)pv@;5km0eO{lAx+#A+i#tWA{R=9YAr$Y1qsm#N#W1PfQFPLvc=s k`V$kKoQ25B7UACp0D|&ZpLg{=8vpKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0002+Nklm~xWSwPycPc+6 zyb(7IgGOJw{S-bl2%3xMaaaJ38vwnDtz9JsE5*eDppDr3t;WmoT3j7sh;#kg5 z&~q$P-HMNO4UrEEz)7MZuKue?gPv7@q?Gg`Q#a$iIP800000NkvXX Hu0mjf`4p6_ literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/alarm_type2.png b/res/screen-density-xhigh/alarm_type2.png new file mode 100644 index 0000000000000000000000000000000000000000..477171c717b7800b69de2c3d498acc48c1d446b5 GIT binary patch literal 2550 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 M07*qoM6N<$f`+Eb!2kdN literal 0 HcmV?d00001 diff --git a/res/screen-density-xhigh/home_type3.png b/res/screen-density-xhigh/home_type3.png new file mode 100644 index 0000000000000000000000000000000000000000..0d413385e299246f70221385338841bf921d55aa GIT binary patch literal 1639 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 Z0e9dyd>`8X%Xw4=4E4-(tF&FC{s)U2hWG#g literal 0 HcmV?d00001 diff --git a/res/screen-size-normal/IDL_APP_INSTALL_FORM.xml b/res/screen-size-normal/IDL_APP_INSTALL_FORM.xml new file mode 100644 index 0000000..b1f0383 --- /dev/null +++ b/res/screen-size-normal/IDL_APP_INSTALL_FORM.xml @@ -0,0 +1,31 @@ + + + + + 720 +
+ + + + +
+ + +
+
+ + +
+ + + + + + +
diff --git a/res/screen-size-normal/IDL_DETAIL_FORM.xml b/res/screen-size-normal/IDL_DETAIL_FORM.xml new file mode 100644 index 0000000..270f785 --- /dev/null +++ b/res/screen-size-normal/IDL_DETAIL_FORM.xml @@ -0,0 +1,33 @@ + + + + + 720 +
+ + + + +
+ + + + +
+
+ + +
+ + + + + + + + + + +
diff --git a/res/screen-size-normal/workflow.xml b/res/screen-size-normal/workflow.xml new file mode 100644 index 0000000..e89967c --- /dev/null +++ b/res/screen-size-normal/workflow.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/shared/res/screen-density-xhigh/mainmenu.png b/shared/res/screen-density-xhigh/mainmenu.png new file mode 100644 index 0000000000000000000000000000000000000000..983c883493a0ae561b9592d54ea8204042b4b6fb GIT binary patch literal 17581 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 +} +#ifdef __cplusplus +} +#endif // __cplusplus diff --git a/src/IstDetailForm.cpp b/src/IstDetailForm.cpp new file mode 100644 index 0000000..dd017e8 --- /dev/null +++ b/src/IstDetailForm.cpp @@ -0,0 +1,506 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://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 IstDetailForm class, which acts as a + * application installer displaying a list of all the privilege description in the TPK file + * and install a package that can be consist of several application. + */ +#include +#include +#include "IstDetailForm.h" +#include "IstInstallerApp.h" +#include "IstInstallEventListener.h" +#include "IstInstallerApp.h" +#include "IstTypes.h" + +using namespace Tizen::Base; +using namespace Tizen::App; +using namespace Tizen::App::Package; +using namespace Tizen::Base::Collection; +using namespace Tizen::Graphics; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; +using namespace Tizen::Security; +using namespace Tizen::App::Package; + +static const int IDA_INSTALL_BTN = 101; + +static const int ID_BUTTON_CLOSE_POPUP = 503; +static const int ID_BUTTON_INSTALL_POPUP = 502; +static const wchar_t LIST_IMAGE_PATH1[] = L"00_button_radio_select_dim.png"; +static const wchar_t DROP_DOWN_IMAGE[] = L"00_list_expand_closed.png"; +static const wchar_t ROLL_UP_IMAGE[] = L"00_list_expand_opened.png"; +static const wchar_t ELM_CHECK_IMAGE[] = L"00_check_checking_dim.png"; + +// Color +static const Color UI_COLOR_WHITE = Color(248, 246, 239, 100); +static const Color UI_COLOR_WHITE2 = Color(0, 0, 0, 0); +// Font +static const int FONT_SIZE_MAIN_TEXT = 33; +static const int FONT_SIZE_SUB_TEXT = 30; +// Control Position & Size +static const int X_TABLE_VIEW_LIST = 0; +static const int Y_TABLE_VIEW_LIST = 250; +static const int X_MAIN_TEXT_LABEL = 80; +static const int Y_MAIN_TEXT_LABEL = 0; +static const int H_MAIN_TEXT_LABEL = 70; +static const int X_SUB_TEXT_LABEL = 95; +static const int Y_SUB_TEXT_LABEL = H_MAIN_TEXT_LABEL - 10; +static const int H_SUB_TEXT_LABEL = 45; +static const int X_MAIN_TEXT_IMAGE = 40; +static const int Y_MAIN_TEXT_IMAGE = 9; +static const int W_MAIN_TEXT_IMAGE = 50; +static const int H_MAIN_TEXT_IMAGE = 50; +static const int H_TABLE_VIEW_LIST_LINE = H_MAIN_TEXT_LABEL + H_SUB_TEXT_LABEL+ 20; + + +DetailForm::DetailForm(void) +{ +} + +DetailForm::~DetailForm(void) +{ +} + +bool +DetailForm::Initialize() +{ + Form::Construct(L"IDL_DETAIL_FORM"); + + return true; +} + +void +DetailForm::CreateTableView(void) +{ + Rectangle rect = GetClientAreaBounds(); + __pList = new (std::nothrow) GroupedTableView(); + __pList->Construct(Rectangle(X_TABLE_VIEW_LIST, Y_TABLE_VIEW_LIST, rect.width, rect.height - (__pTextBox->GetY() + __pTextBox->GetHeight())), true, TABLE_VIEW_SCROLL_BAR_STYLE_FADE_OUT); + __pList->SetItemProvider(this); + __pList->AddGroupedTableViewItemEventListener(*this); + + AddControl(*__pList); + +} + +void +DetailForm::ConfirmPopupOn() +{ + __pPopup->SetShowState(true); + __pPopup->Show(); +} + +result +DetailForm::GetInfoValue(int groupIndex, int itemIndex, String& name, String& description) +{ + String value; + String privilege; + + TryReturn(groupIndex == 0, E_FAILURE, "Group Index Error"); + privilege = dynamic_cast (__pPrivilegeList->GetAt(itemIndex))->GetPointer(); + + name = PrivilegeInfo::GetName(privilege); + description = PrivilegeInfo::GetDescription(privilege); + + return E_SUCCESS; +} + +result +DetailForm::ParsingTPK() +{ + PackageManager* pMgr = PackageManager::GetInstance(); + String filePath; + String packageId; + String localVersion; + PackageInfo* pLocalPackageInfo; + + filePath = static_cast(UiApp::GetInstance())->GetPackagePath(); + // 2. parsing tpk file with file-path + __pTargetPackageInfo = pMgr->GetPackageInfoFromFileN(filePath); + TryReturn(__pTargetPackageInfo, E_FAILURE, "Package Path is not delivered"); + + __pHeader->SetTitleText(__pTargetPackageInfo->GetDisplayName()); + packageId = __pTargetPackageInfo->GetId().GetPointer(); + TryReturn(packageId.IsEmpty() == false, E_FAILURE, "pakcageId is Empty!!!"); + + pLocalPackageInfo = pMgr->GetPackageInfoN(packageId); + + // is the package already installed on local + if (pMgr->IsPackageInstalled(packageId)) + { + TryReturn(pLocalPackageInfo != NULL, E_FAILURE, "Local Package Info get Error"); + + __isInstalled = true; + localVersion = pLocalPackageInfo->GetVersion(); + // Upper Version Check + if (__pTargetPackageInfo->GetVersion().CompareTo(localVersion) <= 0){ + __isUpdatable = false; + } + else{ + __isUpdatable = true; + } + } + else{ + __isInstalled = false; + } + + __pPrivilegeList = __pTargetPackageInfo->GetPrivilegeListN(); + if (__pPrivilegeList) { + __itemCount = __pPrivilegeList->GetCount(); + } + else{ + AppLog("No Privilege List"); + } + + return E_SUCCESS; +} + + +result +DetailForm::ResizeSubText(int lineCount, TableViewItem* pItem, TextBox* pSubTextBox) +{ + result res = E_SUCCESS; + TryReturn(lineCount > 1, E_SUCCESS, ""); + + pItem->SetSize(pItem->GetWidth(), pItem->GetHeight() + H_SUB_TEXT_LABEL * (lineCount - 1)); + pSubTextBox->SetSize(pSubTextBox->GetWidth(), H_SUB_TEXT_LABEL * lineCount); + + return res; +} + +void +DetailForm::SetInfoTextBox() +{ + String installMsg = L"Do you want to install this application?\n\nAllow this application to:"; + if (__isInstalled){ + installMsg.Append(L"\n\n(application will be updated)"); + } + __pTextBox = static_cast(GetControl(L"IDC_INFO_TEXTBOX")); + __pTextBox->SetText(installMsg); + __pTextBox->SetColor(TEXT_BOX_STATUS_NORMAL, UI_COLOR_WHITE); + __pTextBox->Invalidate(false); +} + +void +DetailForm::SetListItemImage(AppResource* pAppResource) +{ + __pHome = pAppResource->GetBitmapN(LIST_IMAGE_PATH1); + __pDropDown = pAppResource->GetBitmapN(DROP_DOWN_IMAGE); + __pHeaderImage = pAppResource->GetBitmapN(HEADER_IMAGE); + __pCheckImage = pAppResource->GetBitmapN(ELM_CHECK_IMAGE); + __pRollUp = pAppResource->GetBitmapN(ROLL_UP_IMAGE); +} + + +void +DetailForm::SetPopupControl() +{ + int popupWidth = GetClientAreaBounds().width - GAP_BETWEEN_FORM_POPUP * 2; + __pPopup = new (std::nothrow) Popup(); + __pPopup->Construct(true, Dimension(popupWidth, UI_H_POPUP)); + __pPopup->SetTitleText(L"Install Application"); + __pPopup->SetTitleTextColor(Color::GetColor(COLOR_ID_BLACK)); + + Label* popUpLabel = new (std::nothrow) Label(); + popUpLabel->Construct(Rectangle(X_POPUP_LABLE, Y_POPUP_LABLE, __pPopup->GetBounds().width - GAP_BETWEEN_POPUP_LABEL*2, H_POPUP_LABLE), L"Application installation will be start."); + popUpLabel->SetTextHorizontalAlignment(ALIGNMENT_LEFT); + popUpLabel->SetTextVerticalAlignment(ALIGNMENT_TOP); + + TextBox* pTextBox = new TextBox(); + pTextBox->Construct(Rectangle(X_POPUP_LABLE, Y_POPUP_LABLE, __pPopup->GetBounds().width - GAP_BETWEEN_POPUP_LABEL*2, UI_H_POPUP - H_POPUP_TITLE), TEXT_BOX_BORDER_NONE); + pTextBox->SetText(L"Application is already installed\n\nInstallation will be closed."); + pTextBox->SetTextSize(33); + + Button* pButtonInstall = new (std::nothrow) Button(); + int buttonWidth = __pPopup->GetBounds().width/2 - GAP_BETWEEN_POPUP_BUTTON; + pButtonInstall->Construct(Rectangle(GetClientAreaBounds().x, pTextBox->GetBounds().y + H_TEXT_LINE, buttonWidth , UI_H_POPUP_BUTTON), L"Install"); + pButtonInstall->SetActionId(ID_BUTTON_INSTALL_POPUP); + pButtonInstall->AddActionEventListener(*this); + + Button* pButtonClose = new (std::nothrow) Button(); + pButtonClose->Construct(Rectangle(GetClientAreaBounds().x + buttonWidth + GAP_BETWEEN_BUTTON , pTextBox->GetBounds().y + H_TEXT_LINE, __pPopup->GetBounds().width/2 - 30, UI_H_POPUP_BUTTON), L"Close"); + pButtonClose->SetActionId(ID_BUTTON_CLOSE_POPUP); + pButtonClose->AddActionEventListener(*this); + + InstallerApp* pUiApp = static_cast(UiApp::GetInstance()); + String packagePath = pUiApp->GetPackagePath(); + if (packagePath.IsEmpty() || pUiApp->IsValidAccess() == false){ + pTextBox->SetText(L"Wrong Execution."); + __pPopup->AddControl(*pTextBox); + pButtonClose->SetPosition(X_CANCEL_BTN_ALONE, pButtonClose->GetY()); + } + else if (__isInstalled && !__isUpdatable){ + __pPopup->AddControl(*pTextBox); + pButtonClose->SetPosition(X_CANCEL_BTN_ALONE, pButtonClose->GetY()); + } + else{ + __pPopup->AddControl(*popUpLabel); + __pPopup->AddControl(*pButtonInstall); + } + __pPopup->AddControl(*pButtonClose); +} + +result +DetailForm::OnInitializing(void) +{ + result r = E_SUCCESS; + AppResource* pAppResource = Application::GetInstance()->GetAppResource(); + + // Set Image Control + SetListItemImage(pAppResource); + + // Header Item set + __pHeader = GetHeader(); + __pHeader->SetTitleIcon(__pHeaderImage); + + // Footer Item Set + Footer* pFooter = GetFooter(); + SetFormBackEventListener(this); + pFooter->AddActionEventListener(*this); + + // initialize variable + __itemCount = 0; + __isUpdatable = false; + __isInstalled = false; + + // parsing tpk package info then get and set item count + ParsingTPK(); + + // Install Confirmation Popup + SetPopupControl(); + + SetInfoTextBox(); + CreateTableView(); + + // Set Disable Controls and Open Popup + ConfirmPopupOn(); + __pTextBox->SetShowState(false); + __pList->SetShowState(false); + + Invalidate(true); + + return r; +} + +result +DetailForm::OnTerminating(void) +{ + result r = E_SUCCESS; + + if (__pTargetPackageInfo){ + delete __pTargetPackageInfo; + } + if (__pPrivilegeList){ + delete __pPrivilegeList; + } + + return r; +} + +void +DetailForm::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + SceneManager* pSceneManager = SceneManager::GetInstance(); + switch (actionId) + { + case IDA_INSTALL_BTN: + { + TryReturnVoid(__pTargetPackageInfo, "target package info is empty"); + + // In case of package update, previous running app has to be closed(killed) + AppManager* pAppManager = AppManager::GetInstance(); + String pakcageId = __pTargetPackageInfo->GetId() + L"." + __pTargetPackageInfo->GetDisplayName(); + AppLog("target package id : %ls" ,pakcageId.GetPointer()); + if (pAppManager->IsRunning(pakcageId)){ + AppLog("App is Running!!"); + //TODO: is this check necessary? + pAppManager->TerminateApplication(pakcageId); + } + + IList* pArgs = null; + pArgs = new (std::nothrow) ArrayList(); + pArgs->Add(*(new (std::nothrow) String(__pTargetPackageInfo->GetDisplayName()))); + + pSceneManager->GoForward(SceneTransitionId(L"ID_SCNT_1"), pArgs); + } + break; + case ID_BUTTON_CLOSE_POPUP: + { + __pPopup->SetShowState(false); + Invalidate(true); + App::GetInstance()->Terminate(); + } + break; + case ID_BUTTON_INSTALL_POPUP: + { + __pPopup->SetShowState(false); + __pTextBox->SetShowState(true); + __pList->SetShowState(true); + Invalidate(true); + } + break; + } +} +void +DetailForm::OnFormBackRequested(Form& source) +{ + UiApp* pApp = UiApp::GetInstance(); + AppAssert(pApp); + pApp->Terminate(); +} + + +void +DetailForm::OnGroupedTableViewGroupItemStateChanged(Tizen::Ui::Controls::GroupedTableView& tableView, int groupIndex, Tizen::Ui::Controls::TableViewGroupItem* pItem, Tizen::Ui::Controls::TableViewItemStatus status) +{ +} + +void +DetailForm::OnGroupedTableViewItemStateChanged(Tizen::Ui::Controls::GroupedTableView& tableView, int groupIndex, int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem, Tizen::Ui::Controls::TableViewItemStatus status) +{ +} + +void +DetailForm::OnGroupedTableViewContextItemActivationStateChanged(Tizen::Ui::Controls::GroupedTableView& tableView, int groupIndex, int itemIndex, Tizen::Ui::Controls::TableViewContextItem* pContextItem, bool activated) +{ +} +int +DetailForm::GetGroupCount(void) +{ + return 1; +} + +int +DetailForm::GetItemCount(int groupIndex) +{ + return __itemCount; +} + +Tizen::Ui::Controls::TableViewGroupItem* +DetailForm::CreateGroupItem(int groupIndex, int itemWidth) +{ + TableViewGroupItem* pItem; + pItem = new (std::nothrow) TableViewGroupItem(); + pItem->Construct(Dimension(itemWidth, 10)); + return pItem; +} + + + + +Tizen::Ui::Controls::TableViewItem* +DetailForm::CreateItem(int groupIndex, int itemIndex, int itemWidth) +{ + String name; + String description; + TableViewItem* pItem = new (std::nothrow) TableViewItem(); + Rectangle rect = GetClientAreaBounds(); + + // Get Title and Description + GetInfoValue(groupIndex, itemIndex, name, description); + + pItem->Construct(Tizen::Graphics::Dimension(rect.width, H_TABLE_VIEW_LIST_LINE), TABLE_VIEW_ANNEX_STYLE_NORMAL); + TryReturn(groupIndex == 0, null, ""); + if (itemIndex < GetItemCount(groupIndex)) + { + Label* pMainTextLable = null; + pMainTextLable = new (std::nothrow) Label(); + + pMainTextLable->Construct(Rectangle(X_MAIN_TEXT_LABEL, Y_MAIN_TEXT_LABEL, pItem->GetWidth() - X_MAIN_TEXT_LABEL, H_MAIN_TEXT_LABEL), name); + + Label* pImageLable = null; + Label* pSubTextLabel = null; + TextBox* pSubTextBox = new TextBox(); + + pImageLable = new (std::nothrow) Label(); + pSubTextLabel = new (std::nothrow) Label(); + pSubTextBox = new TextBox(); + + pMainTextLable->SetTextConfig(FONT_SIZE_MAIN_TEXT, LABEL_TEXT_STYLE_BOLD); + pMainTextLable->SetTextHorizontalAlignment(ALIGNMENT_LEFT); + pMainTextLable->SetTextVerticalAlignment(ALIGNMENT_MIDDLE); + + pImageLable->Construct(Rectangle(X_MAIN_TEXT_IMAGE, Y_MAIN_TEXT_IMAGE, W_MAIN_TEXT_IMAGE, H_MAIN_TEXT_IMAGE), L""); + pImageLable->SetBackgroundBitmap(*__pCheckImage); + + pSubTextBox->Construct(Rectangle(X_SUB_TEXT_LABEL, Y_SUB_TEXT_LABEL, pItem->GetWidth() - X_SUB_TEXT_LABEL, H_SUB_TEXT_LABEL), TEXT_BOX_BORDER_NONE); + pSubTextBox->SetText(description); + pSubTextBox->SetTextSize(FONT_SIZE_SUB_TEXT); + pSubTextBox->SetColor(TEXT_BOX_STATUS_NORMAL, UI_COLOR_WHITE2); + pSubTextBox->SetColor(TEXT_BOX_STATUS_HIGHLIGHTED, UI_COLOR_WHITE2); + pSubTextBox->SetColor(TEXT_BOX_STATUS_DISABLED, UI_COLOR_WHITE2); + ResizeSubText(pSubTextBox->GetLineCount(), pItem, pSubTextBox); + pItem->AddControl(*pMainTextLable); + pItem->AddControl(*pImageLable); + pItem->AddControl(*pSubTextBox); + } + return pItem; +} + +bool +DetailForm::DeleteGroupItem(int groupIndex, TableViewGroupItem* pItem) +{ + delete pItem; + + return true; +} + +void +DetailForm::UpdateGroupItem(int groupIndex, Tizen::Ui::Controls::TableViewGroupItem* pItem) +{ + +} + +bool +DetailForm::DeleteItem(int groupIndex, int itemIndex, TableViewItem* pItem) +{ + delete pItem; + + return true; +} + +void +DetailForm::UpdateItem(int groupIndex, int itemIndex, Tizen::Ui::Controls::TableViewItem* pItem) +{ + +} + +int +DetailForm::GetDefaultGroupItemHeight(void) +{ + return 60; +} + +int +DetailForm::GetDefaultItemHeight(void) +{ + return 150; +} + +void +DetailForm::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs) +{ +} + +void +DetailForm::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ +} diff --git a/src/IstFormFactory.cpp b/src/IstFormFactory.cpp new file mode 100644 index 0000000..7e0d9d3 --- /dev/null +++ b/src/IstFormFactory.cpp @@ -0,0 +1,60 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://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 InstallServiceFormFactory class, which manages + *all the forms of the application. + */ + +#include "IstFormFactory.h" +#include "IstDetailForm.h" +#include "IstInstallForm.h" + +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) +{ + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + Tizen::Ui::Controls::Form* pNewForm = null; + + if (formId == L"IDL_DETAIL_FORM") + { + DetailForm* pForm = new DetailForm(); + pForm->Initialize(); + pNewForm = pForm; + } + else if (formId == L"IDL_APP_INSTALL_FORM") + { + InstallForm* pForm = new InstallForm(); + pForm->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pForm); + pNewForm = pForm; + } + + return pNewForm; +} diff --git a/src/IstInstallEventListener.cpp b/src/IstInstallEventListener.cpp new file mode 100644 index 0000000..3b3db25 --- /dev/null +++ b/src/IstInstallEventListener.cpp @@ -0,0 +1,80 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://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: IstAppInstall.cpp + * @brief: This file contains the implementation of IstAppInstall class, which acts as a + * application installer processing a installation of application. This form also notify + * completion of installation to IstAppInstallForm. + */ + +#include +#include + +#include "IstInstallEventListener.h" +#include "IstTypes.h" + +using namespace Tizen::App; +using namespace Tizen::App::Package; +using namespace Tizen::Base::Collection; +using namespace Tizen::Base; + +InstallEventListener::InstallEventListener() { + +} + +InstallEventListener::~InstallEventListener() { +} + +void +InstallEventListener::OnPackageInstallationResponseReceived(const PackageId& packageId, PackageInstallationResult installationResult) +{ + IList* pArgs = null; + switch(installationResult) + { + case PACKAGE_INSTALLATION_RESULT_SUCCESS: + { + String data = packageId; + + pArgs = new (std::nothrow) ArrayList(); + pArgs->Add(*(new (std::nothrow) String(data))); + UiApp::GetInstance()->GetFrame(APP_NAME)->GetCurrentForm()->SendUserEvent(INSTALL_SUCCESS_EVENT, pArgs); + } + break; + case PACKAGE_INSTALLATION_RESULT_INVALID_PACKAGE: + { + AppLogException("== PACKAGE_INSTALLATION_RESULT_INVALID_PACKAGE == package id : %ls", packageId.GetPointer()); + UiApp::GetInstance()->GetFrame(APP_NAME)->GetCurrentForm()->SendUserEvent(INSTALL_FAIL_INVALID_PACKAGE, pArgs); + } + break; + case PACKAGE_INSTALLATION_RESULT_STORAGE_FULL: + { + AppLogException("== PACKAGE_INSTALLATION_RESULT_STORAGE_FULL == "); + UiApp::GetInstance()->GetFrame(APP_NAME)->GetCurrentForm()->SendUserEvent(INSTALL_FAIL_STORAGE_FULL, pArgs); + } + break; + default: + { + AppLogException("Installation result value is not proper"); + } + break; + } +} + +void +InstallEventListener::OnPackageInstallationInProgressResponseReceived(const PackageId& packageId, int progress) +{ +} diff --git a/src/IstInstallForm.cpp b/src/IstInstallForm.cpp new file mode 100644 index 0000000..f4e8e48 --- /dev/null +++ b/src/IstInstallForm.cpp @@ -0,0 +1,336 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://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: IstAppInstallForm.cpp + * @brief: This file contains the implementation of IstAppInstallForm class, which acts as a + * application installer displaying a progress of installation of application. This form also open + * target application or close installer itself. + */ +#include +#include "IstInstallForm.h" +#include "IstInstallEventListener.h" +#include "IstInstallerApp.h" +#include "IstTypes.h" + +using namespace Tizen::Base; +using namespace Tizen::App; +using namespace Tizen::Graphics; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; +using namespace Tizen::App::Package; + +static const int ID_FOOTER_OPEN = 101; +static const int ID_BUTTON_CLOSE_POPUP = 103; +static const wchar_t* PROGRESS_IMAGE = L"00_progress_pending_02_bg.png"; +static const wchar_t* PROGRESS_EF_IMAGE = L"00_progress_pending_ef_02_bg.png"; +static const wchar_t* POPUP_MSESSAGE_SUCCESS = L"Installation success"; +static const wchar_t* POPUP_MSESSAGE_FAIL = L"Installation fail"; + +static const int TIME_COUNT = 40; +InstallForm::InstallForm(void) +{ +} + +InstallForm::~InstallForm(void) +{ +} + +bool +InstallForm::Initialize() +{ + Form::Construct(L"IDL_APP_INSTALL_FORM"); + + AppResource* pAppResource = Application::GetInstance()->GetAppResource(); + __pAppManager = AppManager::GetInstance(); + + SetFormBackEventListener(this); + + // init variable + __timerCounter = 0; + __isInstalling = true; + __isInstallSuccess = false; + + // Timer + __pTimer = new (std::nothrow) Timer(); + __pTimer->Construct(*this); + __pTimer->StartAsRepeatable(500); + + // progress test image + __pProgressEfImage = pAppResource->GetBitmapN(PROGRESS_EF_IMAGE); + __pProgressImage = pAppResource->GetBitmapN(PROGRESS_IMAGE); + __progressImageLabel = new (std::nothrow) Label(); + __progressImageLabel->Construct(Rectangle(70, 550, 580, 20), L""); + + AddControl(*__progressImageLabel); + + InstallApplication(); + + return true; +} + +void +InstallForm::AddFooterItem() +{ + Footer* pFooter = GetFooter(); + + FooterItem footerItem1; + footerItem1.Construct(ID_FOOTER_OPEN); + footerItem1.SetText(L"Open"); + + pFooter->AddItem(footerItem1); + + pFooter->AddActionEventListener(*this); +} + +void +InstallForm::InstallApplication() +{ + PackageManager* packManager = PackageManager::GetInstance(); + InstallEventListener* appInstallObj = new InstallEventListener(); + String packageId = L"sangs_temp_id"; + String packagePath = static_cast(UiApp::GetInstance())->GetPackagePath(); + result res; + + if (packagePath.IsEmpty()){ + AppLogException("No Tpk File Path"); + SetPopupValueAndOn(L"Installation Fail", L"No Tpk File Path"); + OnPopup(); + return; + } + + res = packManager->InstallPackage(packageId, packagePath, appInstallObj); + if (res != E_SUCCESS) + { + TryLog(res != E_INVALID_ARG, "E_INVALID_ARG"); + TryLog(res != E_SYSTEM, "E_SYSTEM"); + TryLog(res != E_PRIVILEGE_DENIED, "E_PRIVILEGE_DENIED"); + } + else{ + AppLog("INSTALLTAION SUCCESS"); + } +} + + +void +InstallForm::SetPopupValueAndOn(String title, String content) +{ + __pPopup->SetTitleText(title); + __pPopupTextBox->SetText(content); +} + +void +InstallForm::OnPopup() +{ + __pPopup->SetShowState(true); + __pPopup->Show(); +} +void +InstallForm::SetPopupControl() +{ + int popupWidth = GetClientAreaBounds().width - GAP_BETWEEN_FORM_POPUP * 2; + __pPopup = new (std::nothrow) Popup(); + __pPopup->Construct(true, Dimension(popupWidth, UI_H_POPUP)); + __pPopup->SetTitleTextColor(Color::GetColor(COLOR_ID_BLACK)); + + Label* popUpLabel = new (std::nothrow) Label(); + popUpLabel->Construct(Rectangle(X_POPUP_LABLE, Y_POPUP_LABLE, __pPopup->GetBounds().width - GAP_BETWEEN_POPUP_LABEL*2, H_POPUP_LABLE), L"Application installation will be start."); + popUpLabel->SetTextHorizontalAlignment(ALIGNMENT_LEFT); + popUpLabel->SetTextVerticalAlignment(ALIGNMENT_TOP); + + __pPopupTextBox = new TextBox(); + __pPopupTextBox->Construct(Rectangle(X_POPUP_LABLE, Y_POPUP_LABLE, __pPopup->GetBounds().width - GAP_BETWEEN_POPUP_LABEL*2, UI_H_POPUP - H_POPUP_TITLE), TEXT_BOX_BORDER_NONE); + __pPopupTextBox->SetTextSize(33); + + Button* pButtonClose = new (std::nothrow) Button(); + pButtonClose->Construct(Rectangle(GetClientAreaBounds().x, __pPopupTextBox->GetBounds().y + H_TEXT_LINE, __pPopup->GetBounds().width/2 - 30, UI_H_POPUP_BUTTON), L"Close"); + pButtonClose->SetActionId(ID_BUTTON_CLOSE_POPUP); + pButtonClose->AddActionEventListener(*this); + + __pPopup->AddControl(*__pPopupTextBox); + pButtonClose->SetPosition(X_CANCEL_BTN_ALONE, pButtonClose->GetY()); + __pPopup->AddControl(*pButtonClose); +} + +result +InstallForm::OnInitializing(void) +{ + result r = E_SUCCESS; + + __pProgress = static_cast(GetControl(L"IDF_PROGRESS", true)); + __pProgressLabel = static_cast(GetControl(L"IDC_PROGRESS_LABEL", true)); + + // Install Confirmation Popup + SetPopupControl(); + + return r; +} + +result +InstallForm::OnTerminating(void) +{ + result r = E_SUCCESS; + + if (__pTimer){ + delete __pTimer; + } + + return r; +} + + +void +InstallForm::OnTimerExpired(Timer& timer) +{ + __timerCounter++; + // wait closing install app until new app is running for smooth view change + if (!__isInstalling) + { + if (__pAppManager->IsRunning(__packageOperationId)){ + __pTimer->Cancel(); + App::GetInstance()->Terminate(); + } + return; + } + + if (__timerCounter >= TIME_COUNT) + { + if (__isInstallSuccess){ + __pProgressLabel->SetText(POPUP_MSESSAGE_SUCCESS); + __pTimer->Cancel(); + __isInstalling = false; + } + else{ + __pProgressLabel->SetText(POPUP_MSESSAGE_FAIL); + __pTimer->Cancel(); + __isInstalling = false; + } + } + else + { + if (__timerCounter % 2 == 0){ + __progressImageLabel->SetBackgroundBitmap(*__pProgressImage); + } + else{ + __progressImageLabel->SetBackgroundBitmap(*__pProgressEfImage); + } + + } + __pProgress->SetValue(__timerCounter); + __pProgress->Invalidate(false); + __pProgressLabel->Invalidate(false); +} + +void +InstallForm::OnUserEventReceivedN (RequestId requestId, Tizen::Base::Collection::IList *pArgs) +{ + switch(requestId) + { + case INSTALL_SUCCESS_EVENT: + { + __isInstallSuccess = true; + AppLog("Install Success Event is Received"); + __timerCounter = TIME_COUNT; + String *packageId = (String*)pArgs->GetAt(0); +// AppLog("packageId : %ls", packageId->GetPointer()); + + PackageInfo* pLocalPackageInfo; + PackageManager* pMgr = PackageManager::GetInstance(); + pLocalPackageInfo = pMgr->GetPackageInfoN(*packageId); + + __packageOperationId = *packageId + L"." + pLocalPackageInfo->GetDisplayName(); +// AppLog("packageName : %ls", __packageOperationId.GetPointer()); + AddFooterItem(); + } + break; + case INSTALL_FAIL_INVALID_PACKAGE: + { + SetPopupValueAndOn(L"Installation Fail", L"Invalid Package Install Error"); + OnPopup(); + } + break; + case INSTALL_FAIL_STORAGE_FULL: + { + SetPopupValueAndOn(L"Installation Fail", L"Storage Full Install Error"); + OnPopup(); + } + break; + default: + { + AppLogException("error event request ID sended by EndpointThread"); + } + break; + } +} + + +void +InstallForm::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + switch(actionId) + { + case ID_FOOTER_OPEN: + { + AppManager* pAppManager = AppManager::GetInstance(); + + // init timer + __timerCounter = 0; + + pAppManager->LaunchApplication(__packageOperationId); + __pTimer->StartAsRepeatable(500); + } + break; + case ID_BUTTON_CLOSE_POPUP: + { + __pPopup->SetShowState(false); + Invalidate(true); + App::GetInstance()->Terminate(); + } + break; + } +} + +void +InstallForm::OnFormBackRequested(Form& source) +{ + TryReturnVoid(!__isInstalling, null); + + App::GetInstance()->Terminate(); +} + + +void +InstallForm::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs) +{ + AppResource* pAppResource = Application::GetInstance()->GetAppResource(); + Bitmap* pHeaderImage = pAppResource->GetBitmapN(HEADER_IMAGE); + + String *packageName = (String*)pArgs->GetAt(0); + __pHeader = GetHeader(); + __pHeader->SetTitleText(*packageName); + __pHeader->SetTitleIcon(pHeaderImage); + +} + +void +InstallForm::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ +} + + diff --git a/src/IstInstallerApp.cpp b/src/IstInstallerApp.cpp new file mode 100644 index 0000000..017544a --- /dev/null +++ b/src/IstInstallerApp.cpp @@ -0,0 +1,167 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://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 "IstTypes.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::System; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + + +InstallerApp::InstallerApp(void) +{ +} + +InstallerApp::~InstallerApp(void) +{ +} + +UiApp* +InstallerApp::CreateInstance(void) +{ + // Create the instance through the constructor. + return new InstallerApp(); +} + +String +InstallerApp::GetPackagePath() +{ + return __packagePath; +} + +bool +InstallerApp::IsValidAccess() +{ + return __isValidAccess; +} + +void +InstallerApp::SetUri(String uriData) +{ + __uriData.Clear(); + __uriData.Append(uriData); +} + +void +InstallerApp::SetPackagePath(String packagePath) +{ + __packagePath.Clear(); + __packagePath.Append(packagePath); +} + +bool +InstallerApp::OnAppInitializing(AppRegistry& appRegistry) +{ + AppControlProviderManager* pProviderMgr = AppControlProviderManager::GetInstance(); + pProviderMgr->SetAppControlProviderEventListener(this); + + __isValidAccess = false; + + return true; +} + +bool +InstallerApp::OnAppInitialized(void) +{ + // Create a Frame + MainFrame* pMainFrame = new MainFrame(); + pMainFrame->Construct(); + pMainFrame->SetName(APP_NAME); + AddFrame(*pMainFrame); + + return true; +} + +bool +InstallerApp::OnAppWillTerminate(void) +{ + return true; +} + +bool +InstallerApp::OnAppTerminating(AppRegistry& appRegistry, bool forcedTermination) +{ + return true; +} + +void +InstallerApp::OnForeground(void) +{ +} + +void +InstallerApp::OnBackground(void) +{ +} + +void +InstallerApp::OnLowMemory(void) +{ +} + +void +InstallerApp::OnBatteryLevelChanged(BatteryLevel batteryLevel) +{ +} + +void +InstallerApp::OnScreenOn(void) +{ +} + +void +InstallerApp::OnScreenOff(void) +{ +} +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 (pUriData != NULL && !pUriData->IsEmpty()) + { + SetUri(*pUriData); + + String filePath; + // 1. parsing file uri data + if ((*pUriData).StartsWith(FILE_URI_SCHEME, 0)){ + __isValidAccess = true; + (*pUriData).SubString(String(FILE_URI_SCHEME).GetLength(), filePath); + AppLog("packageId : %ls", pUriData->GetPointer()); + AppLog("filePath : %ls", filePath.GetPointer()); + SetPackagePath(filePath); + } + else{ + __isValidAccess = false; + } + } + else{ + __isValidAccess = false; + } +} + + diff --git a/src/IstMainFrame.cpp b/src/IstMainFrame.cpp new file mode 100644 index 0000000..d5192b3 --- /dev/null +++ b/src/IstMainFrame.cpp @@ -0,0 +1,41 @@ +#include "IstMainFrame.h" +#include "IstFormFactory.h" +#include "IstPanelFactory.h" + +using namespace Tizen::Base; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +MainFrame::MainFrame(void) +{ +} + +MainFrame::~MainFrame(void) +{ +} + +result +MainFrame::OnInitializing(void) +{ + // Prepare Scene management. + SceneManager* pSceneManager = SceneManager::GetInstance(); + static FormFactory formFactory; + static PanelFactory panelFactory; + pSceneManager->RegisterFormFactory(formFactory); + pSceneManager->RegisterPanelFactory(panelFactory); + pSceneManager->RegisterScene(L"workflow"); + + // Goto the scene. + result r = pSceneManager->GoForward(SceneTransitionId(L"ID_SCNT_MAINSCENE")); + + return r; +} + +result +MainFrame::OnTerminating(void) +{ + result r = E_SUCCESS; + + return r; +} diff --git a/src/IstPanelFactory.cpp b/src/IstPanelFactory.cpp new file mode 100644 index 0000000..2e11039 --- /dev/null +++ b/src/IstPanelFactory.cpp @@ -0,0 +1,45 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://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: IstPanelFactory.cpp + * @brief: This file contains the implementation of InstallServicePanelFactory class, which manages + * all the panel containers used across the application. + */ + + +#include "IstPanelFactory.h" + +using namespace Tizen::Ui::Scenes; + + +PanelFactory::PanelFactory(void) +{ +} + +PanelFactory::~PanelFactory(void) +{ +} + +Tizen::Ui::Controls::Panel* +PanelFactory::CreatePanelN(const Tizen::Base::String& panelId, const Tizen::Ui::Scenes::SceneId& sceneId) +{ + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + Tizen::Ui::Controls::Panel* pNewPanel = null; + + return pNewPanel; +} diff --git a/src/IstTypes.cpp b/src/IstTypes.cpp new file mode 100644 index 0000000..f8da658 --- /dev/null +++ b/src/IstTypes.cpp @@ -0,0 +1,44 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// Licensed under the Flora License, Version 1.0 (the License); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://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: IstTypes.cpp + * @brief: This file contains common enumerators, static constants used across the application + */ + + +#include "IstTypes.h" + +const int GAP_BETWEEN_FORM_POPUP = 28; +const int X_POPUP_LABLE = 0; +const int Y_POPUP_LABLE = 0; +const int H_POPUP_LABLE = 300; +const int GAP_BETWEEN_POPUP_LABEL = 25; +const int GAP_BETWEEN_POPUP_BUTTON = GAP_BETWEEN_POPUP_LABEL; +const int UI_H_POPUP = 330; +const int UI_H_POPUP_BUTTON = 74; +const int H_POPUP_TITLE = 50; +const int H_TEXT_LINE = 150; +const int GAP_BETWEEN_BUTTON = 10; +const int X_CANCEL_BTN_ALONE = 160; + + +const wchar_t* HEADER_IMAGE = L"home_type3.png"; +const wchar_t* APP_NAME = L"Installer"; +const wchar_t* FILE_URI_SCHEME = L"file://"; + +Tizen::Base::String __uriData; +Tizen::Base::String __packagePath; -- 2.7.4