From e0343736628cae5792030c4e327eb33c5eeb2227 Mon Sep 17 00:00:00 2001 From: Changgyu Choi Date: Mon, 20 Oct 2025 12:34:57 +0900 Subject: [PATCH] Add IoT/UI sample applications Adds: - AppCommon - ApplicationControl Signed-off-by: Changgyu Choi --- IoT/UI/AppCommon/AppCommon.png | Bin 0 -> 24044 bytes IoT/UI/AppCommon/AppCommon.sln | 25 ++ IoT/UI/AppCommon/AppCommon/AppCommon.cs | 112 +++++ IoT/UI/AppCommon/AppCommon/AppCommon.csproj | 23 + IoT/UI/AppCommon/AppCommon/Models/Enums.cs | 50 +++ .../AppCommon/Models/PathInformation.cs | 27 ++ .../Pages/ApplicationInformationPage.cs | 392 ++++++++++++++++++ IoT/UI/AppCommon/AppCommon/Pages/MainPage.cs | 170 ++++++++ IoT/UI/AppCommon/AppCommon/Pages/PathsPage.cs | 283 +++++++++++++ IoT/UI/AppCommon/AppCommon/Resources.cs | 110 +++++ .../Services/AppInformationService.cs | 88 ++++ .../Services/BatteryInformationService.cs | 56 +++ .../AppCommon/Services/DirectoryService.cs | 36 ++ .../Services/IAppInformationService.cs | 37 ++ .../Services/IBatteryInformationService.cs | 39 ++ .../AppCommon/Services/IDirectoryService.cs | 34 ++ .../Services/ISystemSettingsService.cs | 26 ++ .../AppCommon/Services/ServiceLocator.cs | 60 +++ .../Services/SystemSettingsService.cs | 35 ++ .../ApplicationInformationViewModel.cs | 269 ++++++++++++ .../ViewModels/PathsPageViewModel.cs | 110 +++++ .../AppCommon/res/background_app.png | Bin 0 -> 44727 bytes IoT/UI/AppCommon/AppCommon/res/led.png | Bin 0 -> 17838 bytes .../AppCommon/AppCommon/res/list_item_bg.png | Bin 0 -> 3861 bytes .../AppCommon/AppCommon/res/list_top_icon.png | Bin 0 -> 1702 bytes .../AppCommon/shared/res/AppCommon.png | Bin 0 -> 10097 bytes IoT/UI/AppCommon/AppCommon/tizen-manifest.xml | 8 + .../ApplicationControl/ApplicationControl.png | Bin 0 -> 54036 bytes .../ApplicationControl/ApplicationControl.sln | 25 ++ .../ApplicationControl/ApplicationControl.cs | 39 ++ .../ApplicationControl.csproj | 27 ++ .../Helpers/AppControlType.cs | 30 ++ .../Helpers/ApplicationControlHelper.cs | 287 +++++++++++++ .../Models/ApplicationListItem.cs | 63 +++ .../ApplicationControl/Models/Message.cs | 53 +++ .../ApplicationControl/Pages/MainPage.cs | 123 ++++++ .../ApplicationControl/Resources.cs | 124 ++++++ .../ViewModels/MainViewModel.cs | 167 ++++++++ .../Views/ApplicationLayout.cs | 311 ++++++++++++++ .../ApplicationControl/Views/ComposeLayout.cs | 133 ++++++ .../Views/OperationLayout.cs | 203 +++++++++ .../shared/res/ApplicationControl.png | Bin 0 -> 10097 bytes .../ApplicationControl/tizen-manifest.xml | 22 + 43 files changed, 3597 insertions(+) create mode 100755 IoT/UI/AppCommon/AppCommon.png create mode 100755 IoT/UI/AppCommon/AppCommon.sln create mode 100755 IoT/UI/AppCommon/AppCommon/AppCommon.cs create mode 100755 IoT/UI/AppCommon/AppCommon/AppCommon.csproj create mode 100755 IoT/UI/AppCommon/AppCommon/Models/Enums.cs create mode 100755 IoT/UI/AppCommon/AppCommon/Models/PathInformation.cs create mode 100755 IoT/UI/AppCommon/AppCommon/Pages/ApplicationInformationPage.cs create mode 100755 IoT/UI/AppCommon/AppCommon/Pages/MainPage.cs create mode 100755 IoT/UI/AppCommon/AppCommon/Pages/PathsPage.cs create mode 100755 IoT/UI/AppCommon/AppCommon/Resources.cs create mode 100755 IoT/UI/AppCommon/AppCommon/Services/AppInformationService.cs create mode 100755 IoT/UI/AppCommon/AppCommon/Services/BatteryInformationService.cs create mode 100755 IoT/UI/AppCommon/AppCommon/Services/DirectoryService.cs create mode 100755 IoT/UI/AppCommon/AppCommon/Services/IAppInformationService.cs create mode 100755 IoT/UI/AppCommon/AppCommon/Services/IBatteryInformationService.cs create mode 100755 IoT/UI/AppCommon/AppCommon/Services/IDirectoryService.cs create mode 100755 IoT/UI/AppCommon/AppCommon/Services/ISystemSettingsService.cs create mode 100755 IoT/UI/AppCommon/AppCommon/Services/ServiceLocator.cs create mode 100755 IoT/UI/AppCommon/AppCommon/Services/SystemSettingsService.cs create mode 100755 IoT/UI/AppCommon/AppCommon/ViewModels/ApplicationInformationViewModel.cs create mode 100755 IoT/UI/AppCommon/AppCommon/ViewModels/PathsPageViewModel.cs create mode 100755 IoT/UI/AppCommon/AppCommon/res/background_app.png create mode 100755 IoT/UI/AppCommon/AppCommon/res/led.png create mode 100755 IoT/UI/AppCommon/AppCommon/res/list_item_bg.png create mode 100755 IoT/UI/AppCommon/AppCommon/res/list_top_icon.png create mode 100755 IoT/UI/AppCommon/AppCommon/shared/res/AppCommon.png create mode 100755 IoT/UI/AppCommon/AppCommon/tizen-manifest.xml create mode 100755 IoT/UI/ApplicationControl/ApplicationControl.png create mode 100755 IoT/UI/ApplicationControl/ApplicationControl.sln create mode 100755 IoT/UI/ApplicationControl/ApplicationControl/ApplicationControl.cs create mode 100755 IoT/UI/ApplicationControl/ApplicationControl/ApplicationControl.csproj create mode 100755 IoT/UI/ApplicationControl/ApplicationControl/Helpers/AppControlType.cs create mode 100755 IoT/UI/ApplicationControl/ApplicationControl/Helpers/ApplicationControlHelper.cs create mode 100755 IoT/UI/ApplicationControl/ApplicationControl/Models/ApplicationListItem.cs create mode 100755 IoT/UI/ApplicationControl/ApplicationControl/Models/Message.cs create mode 100755 IoT/UI/ApplicationControl/ApplicationControl/Pages/MainPage.cs create mode 100755 IoT/UI/ApplicationControl/ApplicationControl/Resources.cs create mode 100755 IoT/UI/ApplicationControl/ApplicationControl/ViewModels/MainViewModel.cs create mode 100755 IoT/UI/ApplicationControl/ApplicationControl/Views/ApplicationLayout.cs create mode 100755 IoT/UI/ApplicationControl/ApplicationControl/Views/ComposeLayout.cs create mode 100755 IoT/UI/ApplicationControl/ApplicationControl/Views/OperationLayout.cs create mode 100755 IoT/UI/ApplicationControl/ApplicationControl/shared/res/ApplicationControl.png create mode 100755 IoT/UI/ApplicationControl/ApplicationControl/tizen-manifest.xml diff --git a/IoT/UI/AppCommon/AppCommon.png b/IoT/UI/AppCommon/AppCommon.png new file mode 100755 index 0000000000000000000000000000000000000000..a38504b74de298a5df57a49521be3866aa2c99ca GIT binary patch literal 24044 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 + /// Handle LowMemory event + /// + /// Low memory event arguments + protected override void OnLowMemory(LowMemoryEventArgs e) + { + base.OnLowMemory(e); + + // Convert Tizen.Applications.LowMemoryStatus to our LowMemoryStatus enum + var status = Models.LowMemoryStatus.None; + switch (e.LowMemoryStatus) + { + case Tizen.Applications.LowMemoryStatus.Normal: + status = Models.LowMemoryStatus.Normal; + break; + case Tizen.Applications.LowMemoryStatus.SoftWarning: + status = Models.LowMemoryStatus.SoftWarning; + break; + case Tizen.Applications.LowMemoryStatus.HardWarning: + status = Models.LowMemoryStatus.HardWarning; + break; + } + + // Update ViewModel + mainPage?.AppInfoPage?.ViewModel?.UpdateLowMemoryLEDColor(status); + } + + ///

+ /// Handle DeviceOrientation event + /// + /// Device orientation event arguments + protected override void OnDeviceOrientationChanged(DeviceOrientationEventArgs e) + { + base.OnDeviceOrientationChanged(e); + + // Convert Tizen.Applications.DeviceOrientation to our DeviceOrientationStatus enum + var orientation = Models.DeviceOrientationStatus.Orientation_0; + switch (e.DeviceOrientation) + { + case Tizen.Applications.DeviceOrientation.Orientation_0: + orientation = Models.DeviceOrientationStatus.Orientation_0; + break; + case Tizen.Applications.DeviceOrientation.Orientation_90: + orientation = Models.DeviceOrientationStatus.Orientation_90; + break; + case Tizen.Applications.DeviceOrientation.Orientation_180: + orientation = Models.DeviceOrientationStatus.Orientation_180; + break; + case Tizen.Applications.DeviceOrientation.Orientation_270: + orientation = Models.DeviceOrientationStatus.Orientation_270; + break; + } + + // Update ViewModel + mainPage?.AppInfoPage?.ViewModel?.UpdateDeviceOrientation(orientation); + } + + static void Main(string[] args) + { + var app = new Program(); + app.Run(args); + } + } +} diff --git a/IoT/UI/AppCommon/AppCommon/AppCommon.csproj b/IoT/UI/AppCommon/AppCommon/AppCommon.csproj new file mode 100755 index 000000000..8ecc55db0 --- /dev/null +++ b/IoT/UI/AppCommon/AppCommon/AppCommon.csproj @@ -0,0 +1,23 @@ + + + + Exe + net6.0-tizen + + + + portable + + + None + + + + + + + + + + + diff --git a/IoT/UI/AppCommon/AppCommon/Models/Enums.cs b/IoT/UI/AppCommon/AppCommon/Models/Enums.cs new file mode 100755 index 000000000..eaf82ae38 --- /dev/null +++ b/IoT/UI/AppCommon/AppCommon/Models/Enums.cs @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2025 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace AppCommon.Models +{ + /// + /// Low battery status enumeration + /// + public enum LowBatteryStatus + { + None, + PowerOff, + CriticalLow + } + + /// + /// Low memory status enumeration + /// + public enum LowMemoryStatus + { + None, + Normal, + SoftWarning, + HardWarning + } + + /// + /// Device orientation status enumeration + /// + public enum DeviceOrientationStatus + { + Orientation_0, + Orientation_90, + Orientation_180, + Orientation_270 + } +} diff --git a/IoT/UI/AppCommon/AppCommon/Models/PathInformation.cs b/IoT/UI/AppCommon/AppCommon/Models/PathInformation.cs new file mode 100755 index 000000000..da94f1c7e --- /dev/null +++ b/IoT/UI/AppCommon/AppCommon/Models/PathInformation.cs @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2025 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace AppCommon.Models +{ + /// + /// A class to define each path information + /// + public class PathInformation + { + public string Title { get; set; } + public string Path { get; set; } + } +} diff --git a/IoT/UI/AppCommon/AppCommon/Pages/ApplicationInformationPage.cs b/IoT/UI/AppCommon/AppCommon/Pages/ApplicationInformationPage.cs new file mode 100755 index 000000000..e24c61171 --- /dev/null +++ b/IoT/UI/AppCommon/AppCommon/Pages/ApplicationInformationPage.cs @@ -0,0 +1,392 @@ +/* + * Copyright (c) 2025 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.ComponentModel; +using Tizen.NUI; +using Tizen.NUI.BaseComponents; +using Tizen.NUI.Components; +using AppCommon.ViewModels; + +namespace AppCommon.Pages +{ + /// + /// Application information page + /// + public class ApplicationInformationPage : ContentPage + { + private ApplicationInformationViewModel _viewModel; + + // UI Elements + private ImageView _icon; + private TextLabel _applicationName; + private TextLabel _applicationID; + private TextLabel _applicationVersion; + private ImageView _memoryLED; + private ImageView _batteryLED; + private TextLabel _language; + private TextLabel _regionFormat; + private TextLabel _deviceOrientation; + private TextLabel _rotationDegree; + + private int _screenWidth; + private int _screenHeight; + private bool _isLandscape; + + public ApplicationInformationViewModel ViewModel => _viewModel; + + public ApplicationInformationPage(int screenWidth = 720, int screenHeight = 1280) + { + _screenWidth = screenWidth; + _screenHeight = screenHeight; + _isLandscape = screenWidth > screenHeight; + + // Create ViewModel + _viewModel = new ApplicationInformationViewModel(); + + InitializeComponent(); + SetupDataBinding(); + } + + private void InitializeComponent() + { + // Set page properties + AppBar = new AppBar + { + Title = "Application Information" + }; + + // Create main layout with simple background + var mainLayout = new View + { + Layout = new AbsoluteLayout(), + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.MatchParent, + BackgroundColor = new Color(0.95f, 0.95f, 0.95f, 1.0f) // Light gray background + }; + + // Adaptive layout calculations + float iconSize = _isLandscape ? 100f : 150f; + float margin = _isLandscape ? 20f : 30f; + float topOffset = _isLandscape ? 20f : 80f; + float ledSize = _isLandscape ? 15f : 20f; + + // Application Icon + _icon = new ImageView + { + Size = new Size(iconSize, iconSize), + Position = new Position(margin, topOffset) + }; + mainLayout.Add(_icon); + + // Application Name Label + var nameLabel = new TextLabel + { + Text = "Name:", + PixelSize = Resources.SmallFontSize, + TextColor = Resources.Black, + HorizontalAlignment = HorizontalAlignment.Begin, + VerticalAlignment = VerticalAlignment.Top, + Position = new Position(margin, topOffset + iconSize + 15) + }; + mainLayout.Add(nameLabel); + + // Application Name + _applicationName = new TextLabel + { + PixelSize = Resources.NormalFontSize, + TextColor = Resources.DarkGray, + HorizontalAlignment = HorizontalAlignment.Begin, + VerticalAlignment = VerticalAlignment.Top, + MultiLine = true, + Size = new Size(_screenWidth - margin * 2, 40), + Position = new Position(margin, topOffset + iconSize + 35) + }; + mainLayout.Add(_applicationName); + + // Application ID Label + var idLabel = new TextLabel + { + Text = "ID:", + PixelSize = Resources.SmallFontSize, + TextColor = Resources.Black, + HorizontalAlignment = HorizontalAlignment.Begin, + VerticalAlignment = VerticalAlignment.Top, + Position = new Position(margin, topOffset + iconSize + 80) + }; + mainLayout.Add(idLabel); + + // Application ID + _applicationID = new TextLabel + { + PixelSize = Resources.NormalFontSize, + TextColor = Resources.DarkGray, + HorizontalAlignment = HorizontalAlignment.Begin, + VerticalAlignment = VerticalAlignment.Top, + MultiLine = true, + Size = new Size((_screenWidth - margin * 3) / 2, 50), + Position = new Position(margin, topOffset + iconSize + 100) + }; + mainLayout.Add(_applicationID); + + // Application Version Label + var versionLabel = new TextLabel + { + Text = "Version:", + PixelSize = Resources.SmallFontSize, + TextColor = Resources.Black, + HorizontalAlignment = HorizontalAlignment.Begin, + VerticalAlignment = VerticalAlignment.Top, + Position = new Position(_screenWidth / 2 + margin / 2, topOffset + iconSize + 80) + }; + mainLayout.Add(versionLabel); + + // Application Version + _applicationVersion = new TextLabel + { + PixelSize = Resources.NormalFontSize, + TextColor = Resources.DarkGray, + HorizontalAlignment = HorizontalAlignment.Begin, + VerticalAlignment = VerticalAlignment.Top, + MultiLine = true, + Size = new Size((_screenWidth - margin * 3) / 2, 40), + Position = new Position(_screenWidth / 2 + margin / 2, topOffset + iconSize + 100) + }; + mainLayout.Add(_applicationVersion); + + // Memory LED (simple colored circle) + float ledYPos = topOffset + iconSize + 170; + _memoryLED = new ImageView + { + Size = new Size(ledSize, ledSize), + Position = new Position(margin, ledYPos), + BackgroundColor = Resources.LightGray, + CornerRadius = ledSize / 2.0f + }; + mainLayout.Add(_memoryLED); + + // Memory LED Label + var memoryLabel = new TextLabel + { + Text = "Memory:", + PixelSize = Resources.SmallFontSize, + TextColor = Resources.DarkGray, + Position = new Position(margin + ledSize + 10, ledYPos - 5), + Size = new Size(150, 30) + }; + mainLayout.Add(memoryLabel); + + // Battery LED (simple colored circle) + _batteryLED = new ImageView + { + Size = new Size(ledSize, ledSize), + Position = new Position(_screenWidth / 2 + margin / 2, ledYPos), + BackgroundColor = Resources.LightGray, + CornerRadius = ledSize / 2.0f + }; + mainLayout.Add(_batteryLED); + + // Battery LED Label + var batteryLabel = new TextLabel + { + Text = "Battery:", + PixelSize = Resources.SmallFontSize, + TextColor = Resources.DarkGray, + Position = new Position(_screenWidth / 2 + margin / 2 + ledSize + 10, ledYPos - 5), + Size = new Size(150, 30) + }; + mainLayout.Add(batteryLabel); + + // Language Label + float langYPos = ledYPos + 60; + var languageLabel = new TextLabel + { + Text = "Language:", + PixelSize = Resources.SmallFontSize, + TextColor = Resources.Black, + HorizontalAlignment = HorizontalAlignment.Begin, + VerticalAlignment = VerticalAlignment.Top, + Position = new Position(margin, langYPos) + }; + mainLayout.Add(languageLabel); + + // Language + _language = new TextLabel + { + PixelSize = Resources.NormalFontSize, + TextColor = Resources.DarkGray, + HorizontalAlignment = HorizontalAlignment.Begin, + VerticalAlignment = VerticalAlignment.Top, + MultiLine = true, + Size = new Size((_screenWidth - margin * 3) / 2, 40), + Position = new Position(margin, langYPos + 20) + }; + mainLayout.Add(_language); + + // Region Format Label + var regionLabel = new TextLabel + { + Text = "Region:", + PixelSize = Resources.SmallFontSize, + TextColor = Resources.Black, + HorizontalAlignment = HorizontalAlignment.Begin, + VerticalAlignment = VerticalAlignment.Top, + Position = new Position(_screenWidth / 2 + margin / 2, langYPos) + }; + mainLayout.Add(regionLabel); + + // Region Format + _regionFormat = new TextLabel + { + PixelSize = Resources.NormalFontSize, + TextColor = Resources.DarkGray, + HorizontalAlignment = HorizontalAlignment.Begin, + VerticalAlignment = VerticalAlignment.Top, + MultiLine = true, + Size = new Size((_screenWidth - margin * 3) / 2, 40), + Position = new Position(_screenWidth / 2 + margin / 2, langYPos + 20) + }; + mainLayout.Add(_regionFormat); + + // Device Orientation Label + float orientYPos = _isLandscape ? langYPos + 80 : _screenHeight - 120; + var orientationLabel = new TextLabel + { + Text = "Orientation:", + PixelSize = Resources.SmallFontSize, + TextColor = Resources.Black, + HorizontalAlignment = HorizontalAlignment.Begin, + VerticalAlignment = VerticalAlignment.Top, + Position = new Position(margin, orientYPos) + }; + mainLayout.Add(orientationLabel); + + // Device Orientation + _deviceOrientation = new TextLabel + { + PixelSize = Resources.NormalFontSize, + TextColor = Resources.DarkGray, + HorizontalAlignment = HorizontalAlignment.Begin, + VerticalAlignment = VerticalAlignment.Top, + MultiLine = true, + Size = new Size((_screenWidth - margin * 3) / 2, 40), + Position = new Position(margin, orientYPos + 20) + }; + mainLayout.Add(_deviceOrientation); + + // Rotation Degree Label + var degreeLabel = new TextLabel + { + Text = "Rotation:", + PixelSize = Resources.SmallFontSize, + TextColor = Resources.Black, + HorizontalAlignment = HorizontalAlignment.Begin, + VerticalAlignment = VerticalAlignment.Top, + Position = new Position(_screenWidth / 2 + margin / 2, orientYPos) + }; + mainLayout.Add(degreeLabel); + + // Rotation Degree + _rotationDegree = new TextLabel + { + PixelSize = _isLandscape ? 80.0f : Resources.LargeFontSize, + TextColor = Resources.Black, + HorizontalAlignment = HorizontalAlignment.Begin, + VerticalAlignment = VerticalAlignment.Top, + Size = new Size((_screenWidth - margin * 3) / 2, _isLandscape ? 100 : 150), + Position = new Position(_screenWidth / 2 + margin / 2, _isLandscape ? orientYPos + 20 : orientYPos - 30) + }; + mainLayout.Add(_rotationDegree); + + // Set content + Content = mainLayout; + } + + private void SetupDataBinding() + { + // Subscribe to PropertyChanged events for manual data binding + _viewModel.PropertyChanged += OnViewModelPropertyChanged; + + // Initialize UI with current ViewModel values + UpdateUI(); + } + + private void OnViewModelPropertyChanged(object sender, PropertyChangedEventArgs e) + { + // Update UI directly (NUI is already on UI thread) + switch (e.PropertyName) + { + case nameof(_viewModel.IconPath): + _icon.ResourceUrl = _viewModel.IconPath; + break; + case nameof(_viewModel.Name): + _applicationName.Text = _viewModel.Name; + break; + case nameof(_viewModel.ID): + _applicationID.Text = _viewModel.ID; + break; + case nameof(_viewModel.Version): + _applicationVersion.Text = _viewModel.Version; + break; + case nameof(_viewModel.LowMemoryLEDColor): + _memoryLED.BackgroundColor = _viewModel.LowMemoryLEDColor; + break; + case nameof(_viewModel.LowBatteryLEDColor): + _batteryLED.BackgroundColor = _viewModel.LowBatteryLEDColor; + break; + case nameof(_viewModel.Language): + _language.Text = _viewModel.Language; + break; + case nameof(_viewModel.RegionFormat): + _regionFormat.Text = _viewModel.RegionFormat; + break; + case nameof(_viewModel.DeviceOrientation): + _deviceOrientation.Text = _viewModel.DeviceOrientation; + break; + case nameof(_viewModel.RotationDegree): + _rotationDegree.Text = _viewModel.RotationDegree; + break; + } + } + + private void UpdateUI() + { + _icon.ResourceUrl = _viewModel.IconPath; + _applicationName.Text = _viewModel.Name; + _applicationID.Text = _viewModel.ID; + _applicationVersion.Text = _viewModel.Version; + _memoryLED.BackgroundColor = _viewModel.LowMemoryLEDColor; + _batteryLED.BackgroundColor = _viewModel.LowBatteryLEDColor; + _language.Text = _viewModel.Language; + _regionFormat.Text = _viewModel.RegionFormat; + _deviceOrientation.Text = _viewModel.DeviceOrientation; + _rotationDegree.Text = _viewModel.RotationDegree; + } + + protected override void Dispose(DisposeTypes type) + { + if (type == DisposeTypes.Explicit) + { + // Unsubscribe from events + if (_viewModel != null) + { + _viewModel.PropertyChanged -= OnViewModelPropertyChanged; + } + } + base.Dispose(type); + } + } +} diff --git a/IoT/UI/AppCommon/AppCommon/Pages/MainPage.cs b/IoT/UI/AppCommon/AppCommon/Pages/MainPage.cs new file mode 100755 index 000000000..af4a8c229 --- /dev/null +++ b/IoT/UI/AppCommon/AppCommon/Pages/MainPage.cs @@ -0,0 +1,170 @@ +/* + * Copyright (c) 2025 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using Tizen.NUI; +using Tizen.NUI.BaseComponents; +using Tizen.NUI.Components; + +namespace AppCommon.Pages +{ + /// + /// Main page with tab navigation (simulating ColoredTabbedPage) + /// + public class MainPage : ContentPage + { + private View _currentPageContent; + private ApplicationInformationPage _appInfoPage; + private PathsPage _pathsPage; + private Button _appInfoTab; + private Button _pathsTab; + private View _tabBar; + + private int _screenWidth; + private int _screenHeight; + private bool _isLandscape; + + public ApplicationInformationPage AppInfoPage => _appInfoPage; + + public MainPage(int screenWidth = 720, int screenHeight = 1280) + { + _screenWidth = screenWidth; + _screenHeight = screenHeight; + _isLandscape = screenWidth > screenHeight; + + InitializeComponent(); + ShowPage(0); // Show first page by default + } + + private void InitializeComponent() + { + // Create main layout + var mainLayout = new View + { + Layout = new LinearLayout + { + LinearOrientation = LinearLayout.Orientation.Vertical + }, + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.MatchParent + }; + + // Create tab bar (adaptive height based on orientation) + int tabBarHeight = _isLandscape ? 60 : 80; + _tabBar = new View + { + Layout = new LinearLayout + { + LinearOrientation = LinearLayout.Orientation.Horizontal, + HorizontalAlignment = HorizontalAlignment.Center, + VerticalAlignment = VerticalAlignment.Center + }, + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = tabBarHeight, + BackgroundColor = Resources.TabbedPageBarColor + }; + + // Create tab buttons + _appInfoTab = new Button + { + Text = "Application Information", + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.MatchParent, + Weight = 1.0f, + BackgroundColor = Resources.TabbedPageBarColor, + TextColor = Resources.White + }; + _appInfoTab.Clicked += (s, e) => ShowPage(0); + + _pathsTab = new Button + { + Text = "Paths", + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.MatchParent, + Weight = 1.0f, + BackgroundColor = Resources.TabbedPageBarColor, + TextColor = Resources.White + }; + _pathsTab.Clicked += (s, e) => ShowPage(1); + + _tabBar.Add(_appInfoTab); + _tabBar.Add(_pathsTab); + + // Create content container + _currentPageContent = new View + { + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.MatchParent + }; + + // Add tab bar and content to main layout + mainLayout.Add(_tabBar); + mainLayout.Add(_currentPageContent); + + // Set content + Content = mainLayout; + + // Create pages + _appInfoPage = new ApplicationInformationPage(_screenWidth, _screenHeight); + _pathsPage = new PathsPage(_screenWidth, _screenHeight); + } + + private void ShowPage(int index) + { + // Clear current content + if (_currentPageContent.ChildCount > 0) + { + _currentPageContent.Remove(_currentPageContent.GetChildAt(0)); + } + + // Update tab button states + _appInfoTab.BackgroundColor = (index == 0) + ? new Color(0.6f, 0.15f, 0.4f, 1.0f) // Darker shade for selected + : Resources.TabbedPageBarColor; + + _pathsTab.BackgroundColor = (index == 1) + ? new Color(0.6f, 0.15f, 0.4f, 1.0f) // Darker shade for selected + : Resources.TabbedPageBarColor; + + // Show selected page content + switch (index) + { + case 0: + if (_appInfoPage.Content != null) + { + _currentPageContent.Add(_appInfoPage.Content); + } + break; + case 1: + if (_pathsPage.Content != null) + { + _currentPageContent.Add(_pathsPage.Content); + } + break; + } + } + + protected override void Dispose(DisposeTypes type) + { + if (type == DisposeTypes.Explicit) + { + _appInfoPage?.Dispose(); + _pathsPage?.Dispose(); + } + base.Dispose(type); + } + } +} diff --git a/IoT/UI/AppCommon/AppCommon/Pages/PathsPage.cs b/IoT/UI/AppCommon/AppCommon/Pages/PathsPage.cs new file mode 100755 index 000000000..62ac409a9 --- /dev/null +++ b/IoT/UI/AppCommon/AppCommon/Pages/PathsPage.cs @@ -0,0 +1,283 @@ +/* + * Copyright (c) 2025 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using Tizen.NUI; +using Tizen.NUI.BaseComponents; +using Tizen.NUI.Components; +using AppCommon.Models; +using AppCommon.ViewModels; + +namespace AppCommon.Pages +{ + /// + /// Paths information page + /// + public class PathsPage : ContentPage + { + private PathsPageViewModel _viewModel; + private ScrollableBase _scrollView; + private View _listContainer; + private Button _floatingButton; + private AlertDialog _popup; + + private int _screenWidth; + private int _screenHeight; + private double _horizontalScale; + private bool _isLandscape; + + public PathsPage(int screenWidth = 720, int screenHeight = 1280) + { + _screenWidth = screenWidth; + _screenHeight = screenHeight; + _isLandscape = screenWidth > screenHeight; + _horizontalScale = (double)screenWidth / 720.0; + + // Create ViewModel + _viewModel = new PathsPageViewModel(); + + InitializeComponent(); + } + + private void InitializeComponent() + { + // Set page properties + AppBar = new AppBar + { + Title = "Paths" + }; + + // Create main layout with simple background + var mainLayout = new View + { + Layout = new AbsoluteLayout(), + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.MatchParent, + BackgroundColor = new Color(0.95f, 0.95f, 0.95f, 1.0f) // Light gray background + }; + + // Create scrollable list container + _scrollView = new ScrollableBase + { + ScrollingDirection = ScrollableBase.Direction.Vertical, + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.MatchParent, + HideScrollbar = false + }; + + _listContainer = new View + { + Layout = new LinearLayout + { + LinearOrientation = LinearLayout.Orientation.Vertical, + }, + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.WrapContent, + }; + + // Add path items to list + foreach (var pathInfo in _viewModel.Paths) + { + var itemView = CreatePathItemView(pathInfo); + _listContainer.Add(itemView); + } + + _scrollView.Add(_listContainer); + mainLayout.Add(_scrollView); + + // Create floating button (simple text button) + _floatingButton = new Button + { + Text = "↑", + Size = new Size((float)(100 * _horizontalScale), (float)(100 * _horizontalScale)), + Position = new Position(_screenWidth * 0.8194f, _screenHeight * 0.8948f), + BackgroundColor = Resources.TabbedPageBarColor, + TextColor = Color.White, + CornerRadius = (float)(50 * _horizontalScale) + }; + _floatingButton.Clicked += OnFloatingButtonClicked; + mainLayout.Add(_floatingButton); + + // Set content + Content = mainLayout; + } + + private View CreatePathItemView(PathInformation pathInfo) + { + int itemHeight = (int)(227.0 * _horizontalScale); + + var itemView = new View + { + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = itemHeight, + BackgroundColor = Color.White, + Margin = new Extents(0, 0, 2, 2), + Focusable = true, + FocusableInTouch = true, + BoxShadow = new Shadow(5.0f, new Color(0, 0, 0, 0.2f), new Vector2(0, 2)) + }; + + var itemLayout = new View + { + Layout = new LinearLayout + { + LinearOrientation = LinearLayout.Orientation.Vertical, + CellPadding = new Size2D(10, 10), + HorizontalAlignment = HorizontalAlignment.Begin, + VerticalAlignment = VerticalAlignment.Top + }, + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.MatchParent, + Padding = new Extents(20, 20, 10, 10) + }; + + // Title + var titleLabel = new TextLabel + { + Text = pathInfo.Title, + PixelSize = 30.0f, + TextColor = Resources.Black, + FontStyle = new PropertyMap().Add("weight", new PropertyValue("bold")), + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.WrapContent + }; + itemLayout.Add(titleLabel); + + // Path + var pathLabel = new TextLabel + { + Text = pathInfo.Path, + PixelSize = Resources.NormalFontSize, + TextColor = Resources.DarkGray, + MultiLine = true, + Ellipsis = true, + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.WrapContent + }; + itemLayout.Add(pathLabel); + + itemView.Add(itemLayout); + + // Add touch event + itemView.TouchEvent += (sender, e) => + { + if (e.Touch.GetState(0) == PointStateType.Up) + { + OnListItemSelected(pathInfo); + return true; + } + return false; + }; + + return itemView; + } + + private void OnListItemSelected(PathInformation selectedItem) + { + var title = selectedItem.Title; + var path = selectedItem.Path; + var count = 0; + + try + { + count = _viewModel.GetFilesCount(path); + } + catch + { + count = 0; + } + + // Create popup dialog + ShowPathDetailsDialog(title, path, count); + } + + private void ShowPathDetailsDialog(string title, string path, int count) + { + _popup = new AlertDialog + { + Title = title, + }; + + var contentView = new View + { + Layout = new LinearLayout + { + LinearOrientation = LinearLayout.Orientation.Vertical, + CellPadding = new Size2D(10, 10) + }, + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.WrapContent, + Padding = new Extents(20, 20, 20, 20) + }; + + var pathLabel = new TextLabel + { + Text = path, + PixelSize = Resources.NormalFontSize, + TextColor = Resources.Black, + HorizontalAlignment = HorizontalAlignment.Center, + MultiLine = true, + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.WrapContent + }; + contentView.Add(pathLabel); + + var countLabel = new TextLabel + { + Text = $"File count: {count}", + PixelSize = Resources.NormalFontSize, + TextColor = Resources.Black, + HorizontalAlignment = HorizontalAlignment.Center, + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.WrapContent + }; + contentView.Add(countLabel); + + _popup.Content = contentView; + + var closeButton = new Button + { + Text = "CLOSE", + }; + closeButton.Clicked += (sender, e) => + { + _popup.Hide(); + }; + + _popup.Actions = new View[] { closeButton }; + _popup.Show(); + } + + private void OnFloatingButtonClicked(object sender, ClickedEventArgs e) + { + // Scroll to top + _scrollView.ScrollTo(0, true); + } + + protected override void Dispose(DisposeTypes type) + { + if (type == DisposeTypes.Explicit) + { + if (_floatingButton != null) + { + _floatingButton.Clicked -= OnFloatingButtonClicked; + } + } + base.Dispose(type); + } + } +} diff --git a/IoT/UI/AppCommon/AppCommon/Resources.cs b/IoT/UI/AppCommon/AppCommon/Resources.cs new file mode 100755 index 000000000..e4e1a483f --- /dev/null +++ b/IoT/UI/AppCommon/AppCommon/Resources.cs @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2025 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Tizen.NUI; +using Tizen.NUI.BaseComponents; +using Tizen.NUI.Components; + +namespace AppCommon +{ + /// + /// Common resources for the application (colors, styles, etc.) + /// + internal static class Resources + { + // Colors + public static readonly Color White = new Color(1.0f, 1.0f, 1.0f, 1.0f); + public static readonly Color Black = new Color(0.0f, 0.0f, 0.0f, 1.0f); + public static readonly Color Gray = new Color(0.5f, 0.5f, 0.5f, 1.0f); + public static readonly Color LightGray = new Color(0.875f, 0.875f, 0.875f, 1.0f); // RGB(223, 223, 223) + public static readonly Color DarkGray = new Color(0.573f, 0.573f, 0.573f, 1.0f); // RGB(146, 146, 146) + public static readonly Color TabbedPageBarColor = new Color(0.706f, 0.204f, 0.498f, 1.0f); // RGB(180, 52, 127) + public static readonly Color Red = new Color(1.0f, 0.0f, 0.0f, 1.0f); + public static readonly Color Green = new Color(0.0f, 1.0f, 0.0f, 1.0f); + public static readonly Color Yellow = new Color(1.0f, 1.0f, 0.0f, 1.0f); + + // Font sizes + public const float SmallFontSize = 20.0f; + public const float NormalFontSize = 25.0f; + public const float LargeFontSize = 130.0f; + + // TextLabel Styles + public static readonly TextLabelStyle ContentTextStyle = new TextLabelStyle + { + PixelSize = NormalFontSize, + TextColor = DarkGray, + VerticalAlignment = VerticalAlignment.Top, + HorizontalAlignment = HorizontalAlignment.Begin, + MultiLine = true, + Ellipsis = false, + }; + + public static readonly TextLabelStyle LargeContentTextStyle = new TextLabelStyle + { + PixelSize = LargeFontSize, + TextColor = Black, + VerticalAlignment = VerticalAlignment.Top, + HorizontalAlignment = HorizontalAlignment.Begin, + }; + + // Button Styles + public static readonly ButtonStyle PrimaryButtonStyle = new ButtonStyle + { + BackgroundColor = new Selector + { + Normal = TabbedPageBarColor, + Pressed = new Color(0.6f, 0.15f, 0.4f, 1.0f), + }, + Text = new TextLabelStyle + { + TextColor = White, + PixelSize = NormalFontSize, + } + }; + + // Helper method to create TextLabel with content style + public static TextLabel CreateContentLabel(string text) + { + return new TextLabel + { + Text = text, + PixelSize = NormalFontSize, + TextColor = DarkGray, + VerticalAlignment = VerticalAlignment.Top, + HorizontalAlignment = HorizontalAlignment.Begin, + MultiLine = true, + Ellipsis = false, + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.WrapContent, + }; + } + + // Helper method to create TextLabel with large content style + public static TextLabel CreateLargeContentLabel(string text) + { + return new TextLabel + { + Text = text, + PixelSize = LargeFontSize, + TextColor = Black, + VerticalAlignment = VerticalAlignment.Top, + HorizontalAlignment = HorizontalAlignment.Begin, + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.WrapContent, + }; + } + } +} diff --git a/IoT/UI/AppCommon/AppCommon/Services/AppInformationService.cs b/IoT/UI/AppCommon/AppCommon/Services/AppInformationService.cs new file mode 100755 index 000000000..be62cd576 --- /dev/null +++ b/IoT/UI/AppCommon/AppCommon/Services/AppInformationService.cs @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2025 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Tizen.Applications; + +namespace AppCommon.Services +{ + /// + /// Implementation of application information service + /// + public class AppInformationService : IAppInformationService + { + private static readonly Application Current = Application.Current; + + public string ID + { + get { return Current.ApplicationInfo.ApplicationId; } + } + + public string Name + { + get { return Current.ApplicationInfo.Label; } + } + + public string IconPath + { + get { return Current.ApplicationInfo.IconPath; } + } + + public string CachePath + { + get { return Current.DirectoryInfo.Cache; } + } + + public string ExternalCachePath + { + get { return Current.DirectoryInfo.ExternalCache; } + } + + public string ExternalDataPath + { + get { return Current.DirectoryInfo.ExternalData; } + } + + public string ExternalSharedDataPath + { + get { return Current.DirectoryInfo.ExternalSharedData; } + } + + public string ResourcePath + { + get { return Current.DirectoryInfo.Resource; } + } + + public string ResourcesPath + { + get { return Current.DirectoryInfo.Resource; } + } + + public string SharedDataPath + { + get { return Current.ApplicationInfo.SharedDataPath; } + } + + public string SharedResourcePath + { + get { return Current.ApplicationInfo.SharedResourcePath; } + } + + public string SharedTrustedPath + { + get { return Current.ApplicationInfo.SharedTrustedPath; } + } + } +} diff --git a/IoT/UI/AppCommon/AppCommon/Services/BatteryInformationService.cs b/IoT/UI/AppCommon/AppCommon/Services/BatteryInformationService.cs new file mode 100755 index 000000000..031d3cfc1 --- /dev/null +++ b/IoT/UI/AppCommon/AppCommon/Services/BatteryInformationService.cs @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2025 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using AppCommon.Models; +using TBattery = Tizen.System.Battery; + +namespace AppCommon.Services +{ + /// + /// Implementation of battery information service + /// + public class BatteryInformationService : IBatteryInformationService + { + public BatteryInformationService() + { + TBattery.PercentChanged += (s, e) => + { + var status = LowBatteryStatus.None; + if (e.Percent > 5) + { + status = LowBatteryStatus.None; + } + else if (e.Percent > 0) + { + status = LowBatteryStatus.CriticalLow; + } + else + { + status = LowBatteryStatus.PowerOff; + } + OnLevelChanged(new BatteryLevelChangedEventArgs(status)); + }; + } + + public event EventHandler LevelChanged; + + void OnLevelChanged(BatteryLevelChangedEventArgs e) + { + LevelChanged?.Invoke(this, e); + } + } +} diff --git a/IoT/UI/AppCommon/AppCommon/Services/DirectoryService.cs b/IoT/UI/AppCommon/AppCommon/Services/DirectoryService.cs new file mode 100755 index 000000000..c9499589b --- /dev/null +++ b/IoT/UI/AppCommon/AppCommon/Services/DirectoryService.cs @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2025 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.IO; + +namespace AppCommon.Services +{ + /// + /// Implementation of directory service + /// + public class DirectoryService : IDirectoryService + { + public bool Exists(string path) + { + return Directory.Exists(path); + } + + public string[] GetFiles(string path) + { + return Directory.GetFiles(path); + } + } +} diff --git a/IoT/UI/AppCommon/AppCommon/Services/IAppInformationService.cs b/IoT/UI/AppCommon/AppCommon/Services/IAppInformationService.cs new file mode 100755 index 000000000..73aa7ab1f --- /dev/null +++ b/IoT/UI/AppCommon/AppCommon/Services/IAppInformationService.cs @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2025 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace AppCommon.Services +{ + /// + /// Interface for application information service + /// + public interface IAppInformationService + { + string ID { get; } + string Name { get; } + string IconPath { get; } + string CachePath { get; } + string ExternalCachePath { get; } + string ExternalDataPath { get; } + string ExternalSharedDataPath { get; } + string ResourcePath { get; } + string ResourcesPath { get; } + string SharedDataPath { get; } + string SharedResourcePath { get; } + string SharedTrustedPath { get; } + } +} diff --git a/IoT/UI/AppCommon/AppCommon/Services/IBatteryInformationService.cs b/IoT/UI/AppCommon/AppCommon/Services/IBatteryInformationService.cs new file mode 100755 index 000000000..949442195 --- /dev/null +++ b/IoT/UI/AppCommon/AppCommon/Services/IBatteryInformationService.cs @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2025 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using AppCommon.Models; + +namespace AppCommon.Services +{ + public class BatteryLevelChangedEventArgs : EventArgs + { + public BatteryLevelChangedEventArgs(LowBatteryStatus level) + { + LowBatteryStatus = level; + } + + public LowBatteryStatus LowBatteryStatus { get; private set; } + } + + /// + /// Interface for battery information service + /// + public interface IBatteryInformationService + { + event EventHandler LevelChanged; + } +} diff --git a/IoT/UI/AppCommon/AppCommon/Services/IDirectoryService.cs b/IoT/UI/AppCommon/AppCommon/Services/IDirectoryService.cs new file mode 100755 index 000000000..1302a1bed --- /dev/null +++ b/IoT/UI/AppCommon/AppCommon/Services/IDirectoryService.cs @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2025 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace AppCommon.Services +{ + /// + /// Directory service interface + /// + public interface IDirectoryService + { + /// + /// Returns the names of files (including their paths) in the specified directory. + /// + string[] GetFiles(string path); + + /// + /// Determines whether the given path refers to an existing directory on disk. + /// + bool Exists(string path); + } +} diff --git a/IoT/UI/AppCommon/AppCommon/Services/ISystemSettingsService.cs b/IoT/UI/AppCommon/AppCommon/Services/ISystemSettingsService.cs new file mode 100755 index 000000000..665aaeb48 --- /dev/null +++ b/IoT/UI/AppCommon/AppCommon/Services/ISystemSettingsService.cs @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2025 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace AppCommon.Services +{ + /// + /// System settings service interface + /// + public interface ISystemSettingsService + { + string Language { get; } + } +} diff --git a/IoT/UI/AppCommon/AppCommon/Services/ServiceLocator.cs b/IoT/UI/AppCommon/AppCommon/Services/ServiceLocator.cs new file mode 100755 index 000000000..674ea3d81 --- /dev/null +++ b/IoT/UI/AppCommon/AppCommon/Services/ServiceLocator.cs @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2025 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; + +namespace AppCommon.Services +{ + /// + /// Simple service locator to replace Xamarin.Forms DependencyService + /// + public static class ServiceLocator + { + private static readonly Dictionary _services = new Dictionary(); + + /// + /// Register a service implementation + /// + public static void Register(TInterface implementation) + { + _services[typeof(TInterface)] = implementation; + } + + /// + /// Get a registered service + /// + public static TInterface Get() + { + if (_services.TryGetValue(typeof(TInterface), out var service)) + { + return (TInterface)service; + } + throw new InvalidOperationException($"Service {typeof(TInterface).Name} not registered"); + } + + /// + /// Initialize all services + /// + public static void Initialize() + { + Register(new AppInformationService()); + Register(new BatteryInformationService()); + Register(new DirectoryService()); + Register(new SystemSettingsService()); + } + } +} diff --git a/IoT/UI/AppCommon/AppCommon/Services/SystemSettingsService.cs b/IoT/UI/AppCommon/AppCommon/Services/SystemSettingsService.cs new file mode 100755 index 000000000..5f21e2b38 --- /dev/null +++ b/IoT/UI/AppCommon/AppCommon/Services/SystemSettingsService.cs @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2025 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Globalization; +using TSystem = Tizen.System; + +namespace AppCommon.Services +{ + /// + /// Implementation of system settings service + /// + public class SystemSettingsService : ISystemSettingsService + { + public string Language + { + get + { + return new CultureInfo(TSystem.SystemSettings.LocaleLanguage).DisplayName; + } + } + } +} diff --git a/IoT/UI/AppCommon/AppCommon/ViewModels/ApplicationInformationViewModel.cs b/IoT/UI/AppCommon/AppCommon/ViewModels/ApplicationInformationViewModel.cs new file mode 100755 index 000000000..749a0cf5a --- /dev/null +++ b/IoT/UI/AppCommon/AppCommon/ViewModels/ApplicationInformationViewModel.cs @@ -0,0 +1,269 @@ +/* + * Copyright (c) 2025 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.ComponentModel; +using Tizen.NUI; +using AppCommon.Models; +using AppCommon.Services; + +namespace AppCommon.ViewModels +{ + /// + /// ViewModel for application information page + /// + public class ApplicationInformationViewModel : INotifyPropertyChanged + { + private const string degree = "\u00b0"; + + private string _id; + private string _name; + private string _iconPath; + private string _version; + private Color _lowBatteryLEDColor; + private Color _lowMemoryLEDColor; + private string _language; + private string _regionFormat; + private string _deviceOrientation; + private string _rotationDegree; + + public ApplicationInformationViewModel() + { + Initialize(); + } + + public string ID + { + get => _id; + set + { + if (_id != value) + { + _id = value; + OnPropertyChanged(nameof(ID)); + } + } + } + + public string Name + { + get => _name; + set + { + if (_name != value) + { + _name = value; + OnPropertyChanged(nameof(Name)); + } + } + } + + public string IconPath + { + get => _iconPath; + set + { + if (_iconPath != value) + { + _iconPath = value; + OnPropertyChanged(nameof(IconPath)); + } + } + } + + public string Version + { + get => _version; + set + { + if (_version != value) + { + _version = value; + OnPropertyChanged(nameof(Version)); + } + } + } + + public Color LowBatteryLEDColor + { + get => _lowBatteryLEDColor; + set + { + if (_lowBatteryLEDColor != value) + { + _lowBatteryLEDColor = value; + OnPropertyChanged(nameof(LowBatteryLEDColor)); + } + } + } + + public Color LowMemoryLEDColor + { + get => _lowMemoryLEDColor; + set + { + if (_lowMemoryLEDColor != value) + { + _lowMemoryLEDColor = value; + OnPropertyChanged(nameof(LowMemoryLEDColor)); + } + } + } + + public string Language + { + get => _language; + set + { + if (_language != value) + { + _language = value; + OnPropertyChanged(nameof(Language)); + } + } + } + + public string RegionFormat + { + get => _regionFormat; + set + { + if (_regionFormat != value) + { + _regionFormat = value; + OnPropertyChanged(nameof(RegionFormat)); + } + } + } + + public string DeviceOrientation + { + get => _deviceOrientation; + set + { + if (_deviceOrientation != value) + { + _deviceOrientation = value; + OnPropertyChanged(nameof(DeviceOrientation)); + } + } + } + + public string RotationDegree + { + get => _rotationDegree; + set + { + if (_rotationDegree != value) + { + _rotationDegree = value; + OnPropertyChanged(nameof(RotationDegree)); + } + } + } + + public void UpdateLowBatteryLEDColor(LowBatteryStatus status) + { + switch (status) + { + case LowBatteryStatus.PowerOff: + LowBatteryLEDColor = Resources.Red; + return; + case LowBatteryStatus.CriticalLow: + LowBatteryLEDColor = Resources.Yellow; + return; + case LowBatteryStatus.None: + default: + LowBatteryLEDColor = Resources.LightGray; + return; + } + } + + public void UpdateLowMemoryLEDColor(LowMemoryStatus status) + { + switch (status) + { + case LowMemoryStatus.HardWarning: + LowMemoryLEDColor = Resources.Red; + return; + case LowMemoryStatus.SoftWarning: + LowMemoryLEDColor = Resources.Yellow; + return; + case LowMemoryStatus.Normal: + LowMemoryLEDColor = Resources.Green; + return; + case LowMemoryStatus.None: + default: + LowMemoryLEDColor = Resources.LightGray; + return; + } + } + + public void UpdateDeviceOrientation(DeviceOrientationStatus orientation) + { + switch (orientation) + { + case DeviceOrientationStatus.Orientation_0: + DeviceOrientation = "Natural position"; + RotationDegree = "0" + degree; + return; + case DeviceOrientationStatus.Orientation_90: + DeviceOrientation = "Right-side up"; + RotationDegree = "90" + degree; + return; + case DeviceOrientationStatus.Orientation_180: + DeviceOrientation = "Up-side down"; + RotationDegree = "180" + degree; + return; + case DeviceOrientationStatus.Orientation_270: + DeviceOrientation = "Left-side up"; + RotationDegree = "270" + degree; + return; + } + } + + public event PropertyChangedEventHandler PropertyChanged; + + protected virtual void OnPropertyChanged(string propertyName) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + + void Initialize() + { + var appInfo = ServiceLocator.Get(); + var systemSettings = ServiceLocator.Get(); + var batteryInfo = ServiceLocator.Get(); + + batteryInfo.LevelChanged += (s, e) => + { + UpdateLowBatteryLEDColor(e.LowBatteryStatus); + }; + + ID = appInfo.ID; + Name = appInfo.Name; + IconPath = appInfo.IconPath; + + Version = "0.0.0.1"; + LowBatteryLEDColor = Resources.LightGray; + LowMemoryLEDColor = Resources.LightGray; + Language = systemSettings.Language; + RegionFormat = systemSettings.Language; + + DeviceOrientation = "Natural position"; + RotationDegree = "0" + degree; + } + } +} diff --git a/IoT/UI/AppCommon/AppCommon/ViewModels/PathsPageViewModel.cs b/IoT/UI/AppCommon/AppCommon/ViewModels/PathsPageViewModel.cs new file mode 100755 index 000000000..b09ef1fff --- /dev/null +++ b/IoT/UI/AppCommon/AppCommon/ViewModels/PathsPageViewModel.cs @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2025 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Collections.Generic; +using AppCommon.Models; +using AppCommon.Services; + +namespace AppCommon.ViewModels +{ + /// + /// ViewModel for paths page + /// + public class PathsPageViewModel + { + private IAppInformationService _appInfo; + private IDirectoryService _directory; + + public PathsPageViewModel() + { + Initialize(); + } + + public List Paths { get; set; } + + public int GetFilesCount(string path) + { + try + { + return _directory.GetFiles(path).Length; + } + catch + { + return 0; + } + } + + void Initialize() + { + Paths = new List(); + _appInfo = ServiceLocator.Get(); + _directory = ServiceLocator.Get(); + + SetListItems(); + } + + private void SetListItems() + { + Paths.Add(new PathInformation + { + Title = "Resources", + Path = _appInfo.ResourcesPath + }); + + Paths.Add(new PathInformation + { + Title = "Cache", + Path = _appInfo.CachePath + }); + + Paths.Add(new PathInformation + { + Title = "Shared Data", + Path = _appInfo.SharedDataPath + }); + + Paths.Add(new PathInformation + { + Title = "Shared Resource", + Path = _appInfo.SharedResourcePath + }); + + Paths.Add(new PathInformation + { + Title = "Shared Trusted", + Path = _appInfo.SharedTrustedPath + }); + + Paths.Add(new PathInformation + { + Title = "External Data", + Path = _appInfo.ExternalDataPath + }); + + Paths.Add(new PathInformation + { + Title = "External Cache", + Path = _appInfo.ExternalCachePath + }); + + Paths.Add(new PathInformation + { + Title = "External Shared Data", + Path = _appInfo.ExternalSharedDataPath + }); + } + } +} diff --git a/IoT/UI/AppCommon/AppCommon/res/background_app.png b/IoT/UI/AppCommon/AppCommon/res/background_app.png new file mode 100755 index 0000000000000000000000000000000000000000..7795f2c15bcf9e72437a660bc0cad34483d6e19b GIT binary patch literal 44727 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 literal 0 HcmV?d00001 diff --git a/IoT/UI/AppCommon/AppCommon/res/list_item_bg.png b/IoT/UI/AppCommon/AppCommon/res/list_item_bg.png new file mode 100755 index 0000000000000000000000000000000000000000..5f1e601fee92dc53f60422dd5fcd27362a5dd079 GIT binary patch literal 3861 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 TJbOA100000NkvXXu0mjf?x(Kf literal 0 HcmV?d00001 diff --git a/IoT/UI/AppCommon/AppCommon/tizen-manifest.xml b/IoT/UI/AppCommon/AppCommon/tizen-manifest.xml new file mode 100755 index 000000000..9aae38fa6 --- /dev/null +++ b/IoT/UI/AppCommon/AppCommon/tizen-manifest.xml @@ -0,0 +1,8 @@ + + + + + + AppCommon.png + + diff --git a/IoT/UI/ApplicationControl/ApplicationControl.png b/IoT/UI/ApplicationControl/ApplicationControl.png new file mode 100755 index 0000000000000000000000000000000000000000..2b1b8528749b7cad63aeaf09c788744b8b094fda GIT binary patch literal 54036 zcmc$FXIN8d*Dj8ugVI%`35=rjUZn&C6hwL_ARvT<5}MK^v{9N$6M@hq^xg@*jvyc; z^b$HU7)nAD2t9B%>b&3goge4dIoI*Jq-^%y+0WYRS?gZ+z1CYj9d(+ktXC;0C}=bu zKQy4AxQL;k_>GtHGH}Go#8(FRcEQ6yU4^2o|JEw-%kTEe+R79Zl`&K&HkW|kued)3 zdr(l&cAWpe(Ct=WM?o=MsPRzQ=%v*f*{7PlGi@)X-w)@9YmsQ%kCFEoKJGv0ce~~O z_cKUU<)^;#!c9>c7__ic~n8yw|6&%SR`xxyeUBDZh=^VXqRtpAOfCH=0_p;Xaf}q$on7k2hZNH0TCA z58CIno){pnnKCt9+0=z=m_FKJ66|+n4Z&a>zW)OSlS|DzMG?PN&p)gtff3J4pWJ@7 zA0$1E6FSrErbda(3;LM!E_Wn*SRm^(shEVk&e}xSzm{$6KiE6WjxnicbM^fUBCUNv zRvTCE_yjJZIHen*zAQG#U-mC(mQDemc5aGz;Lg6=)RA4g8^zpOab~UVL)UQoQ+~4+ zZn~ariVH7%@TC2wwv#a}_-rXT-BTp;Wd}QXT5~3CpT2b5ZxNQE}!(2W? z`-YMJh9UCyL96SaN4XsaDR_t`25m}!75T%di;?>c1e9R9hj63Ru{B1x;h!?B79ogq zU+Meq8$l7gtj}ClSD7A$ z2xa@eZ4rexk�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 literal 0 HcmV?d00001 diff --git a/IoT/UI/ApplicationControl/ApplicationControl.sln b/IoT/UI/ApplicationControl/ApplicationControl.sln new file mode 100755 index 000000000..0833907cf --- /dev/null +++ b/IoT/UI/ApplicationControl/ApplicationControl.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.14.36414.22 d17.14 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ApplicationControl", "ApplicationControl\ApplicationControl.csproj", "{ECC6B993-E617-4D8E-8789-026A99CE3C86}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {ECC6B993-E617-4D8E-8789-026A99CE3C86}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ECC6B993-E617-4D8E-8789-026A99CE3C86}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ECC6B993-E617-4D8E-8789-026A99CE3C86}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ECC6B993-E617-4D8E-8789-026A99CE3C86}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {A37209D3-A9C7-4D51-A0C2-4F7F760481F4} + EndGlobalSection +EndGlobal diff --git a/IoT/UI/ApplicationControl/ApplicationControl/ApplicationControl.cs b/IoT/UI/ApplicationControl/ApplicationControl/ApplicationControl.cs new file mode 100755 index 000000000..b6dbd1eb5 --- /dev/null +++ b/IoT/UI/ApplicationControl/ApplicationControl/ApplicationControl.cs @@ -0,0 +1,39 @@ +using System; +using Tizen.NUI; +using Tizen.NUI.Components; +using Tizen.NUI.BaseComponents; +using ApplicationControl.Pages; + +namespace ApplicationControl +{ + class Program : NUIApplication + { + private Window window; + private Navigator navigator; + + protected override void OnCreate() + { + base.OnCreate(); + // Disable XAML usage + IsUsingXaml = false; + Initialize(); + } + + void Initialize() + { + window = NUIApplication.GetDefaultWindow(); + window.BackgroundColor = Color.White; + + // Get default navigator and push MainPage + navigator = window.GetDefaultNavigator(); + var mainPage = new MainPage(); + navigator.Push(mainPage); + } + + static void Main(string[] args) + { + var app = new Program(); + app.Run(args); + } + } +} diff --git a/IoT/UI/ApplicationControl/ApplicationControl/ApplicationControl.csproj b/IoT/UI/ApplicationControl/ApplicationControl/ApplicationControl.csproj new file mode 100755 index 000000000..0aae0055f --- /dev/null +++ b/IoT/UI/ApplicationControl/ApplicationControl/ApplicationControl.csproj @@ -0,0 +1,27 @@ + + + + + Exe + net6.0-tizen + + + + portable + + + None + + + + + + + + + True + + + + + diff --git a/IoT/UI/ApplicationControl/ApplicationControl/Helpers/AppControlType.cs b/IoT/UI/ApplicationControl/ApplicationControl/Helpers/AppControlType.cs new file mode 100755 index 000000000..80ca95033 --- /dev/null +++ b/IoT/UI/ApplicationControl/ApplicationControl/Helpers/AppControlType.cs @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace ApplicationControl.Helpers +{ + /// + /// An enumeration for appcontrol type + /// + public enum AppControlType + { + View, + Pick, + Compose, + Send, + Unknown, + } +} diff --git a/IoT/UI/ApplicationControl/ApplicationControl/Helpers/ApplicationControlHelper.cs b/IoT/UI/ApplicationControl/ApplicationControl/Helpers/ApplicationControlHelper.cs new file mode 100755 index 000000000..44692496f --- /dev/null +++ b/IoT/UI/ApplicationControl/ApplicationControl/Helpers/ApplicationControlHelper.cs @@ -0,0 +1,287 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using Tizen.Applications; +using ApplicationControl.Models; + +namespace ApplicationControl.Helpers +{ + /// + /// A singleton class to manipulate application operation + /// + public class ApplicationOperations + { + static ApplicationOperations _instance; + Dictionary _launchedAppControl; + + ApplicationOperations() + { + _launchedAppControl = new Dictionary(); + } + + static public ApplicationOperations Instance + { + get + { + if (_instance == null) + { + _instance = new ApplicationOperations(); + } + + return _instance; + } + } + + /// + /// To get the selected operation id + /// + /// selected operation name + /// selected operation id + public IEnumerable GetMatchedApplicationIds(string operation) + { + AppControl appControl = new AppControl + { + Operation = operation, + LaunchMode = AppControlLaunchMode.Group + }; + if (operation.Equals(AppControlOperations.View)) + { + appControl.Uri = "http"; + } + + return AppControl.GetMatchedApplicationIds(appControl); + } + + /// + /// To send launch request + /// + /// selected operation + /// selected operation app + /// a message to send + public void SendLaunchRequest(string operation, string id, Message data = null) + { + var appCon = new AppControl + { + Operation = operation, + LaunchMode = AppControlLaunchMode.Group + }; + + if (data != null) + { + if (!String.IsNullOrEmpty(data.To)) + { + appCon.ExtraData.Add(AppControlData.To, data.To); + } + + appCon.ExtraData.Add(AppControlData.Subject, data.Subject); + appCon.ExtraData.Add(AppControlData.Text, data.Text); + } + + if (!string.IsNullOrEmpty(id)) + { + appCon.ApplicationId = id; + SaveLaunchedAppControl(appCon); + } + + try + { + AppControl.SendLaunchRequest(appCon); + } + catch + { + /// Error Handling Codes + } + } + + /// + /// To send a terminate request + /// + /// a selected application ID + public void SendTerminateRequest(string id) + { + var appCon = GetLaunchedAppControl(id); + if (appCon == null) + { + return; + } + + try + { + AppControl.SendTerminateRequest(appCon); + RemoveLaunchedAppControl(appCon.ApplicationId); + } + catch (Exception e) + { + Debug.WriteLine(e.Message); + } + } + + /// + /// To get the application icon path + /// + /// An application ID + /// The application icon path + public string GetApplicationIconPath(string id) + { + var info = new ApplicationInfo(id); + string iconPath = info.IconPath; + info.Dispose(); + return iconPath; + } + + /// + /// The view operation + /// + public string View => AppControlOperations.View; + + /// + /// The pick operation + /// + public string Pick => AppControlOperations.Pick; + + /// + /// The compose operation + /// + public string Compose => AppControlOperations.Compose; + + /// + /// The send operation + /// + public string Send => AppControlOperations.Send; + + /// + /// To save a launched appcontrol that it will be used to send a kill request later + /// + /// An application control to save + void SaveLaunchedAppControl(AppControl appCon) + { + if (!_launchedAppControl.ContainsKey(appCon.ApplicationId)) + { + _launchedAppControl.Add(appCon.ApplicationId, appCon); + } + } + + /// + /// To get the application control by an application ID + /// + /// An application ID + /// An application control + AppControl GetLaunchedAppControl(string id) + { + if (!_launchedAppControl.ContainsKey(id)) + { + return null; + } + + return _launchedAppControl[id]; + } + + /// + /// To remove an application control by an application ID + /// + /// An application ID + void RemoveLaunchedAppControl(string id) + { + _launchedAppControl.Remove(id); + } + } + + /// + /// A static class to manipulate the application control and the application information functionalities + /// + static public class ApplicationControlHelper + { + /// + /// To get application IDs matched a specific appcontrol type + /// + /// an appcontrol type + /// application IDs + public static IEnumerable GetApplicationIdsForSpecificAppControlType(AppControlType type) + { + return ApplicationOperations.Instance.GetMatchedApplicationIds(IntToString(type)); + } + + /// + /// To get the application icon path for an application + /// + /// an application ID + /// the application icon path + public static string GetApplicationIconPath(string id) + { + return ApplicationOperations.Instance.GetApplicationIconPath(id); + } + + /// + /// To send a launch request + /// + /// an appcontrol type + /// an application ID + /// a message to pass with an appcontrol + public static void ExecuteApplication(AppControlType type, string id, Message data = null) + { + ApplicationOperations.Instance.SendLaunchRequest(IntToString(type), id, data); + } + + /// + /// To send a terminate request + /// + /// an application ID + public static void KillApplication(string id) + { + ApplicationOperations.Instance.SendTerminateRequest(id); + } + + /// + /// To change an enumeration to a matched string + /// + /// An enumeration + /// A matched string + static string IntToString(AppControlType type) + { + var operation = ApplicationOperations.Instance; + switch (type) + { + case AppControlType.View: + { + return operation.View; + } + + case AppControlType.Pick: + { + return operation.Pick; + } + + case AppControlType.Compose: + { + return operation.Compose; + } + + case AppControlType.Send: + { + return operation.Send; + } + + default: + { + return "Unknown"; + } + } + } + } +} diff --git a/IoT/UI/ApplicationControl/ApplicationControl/Models/ApplicationListItem.cs b/IoT/UI/ApplicationControl/ApplicationControl/Models/ApplicationListItem.cs new file mode 100755 index 000000000..c13853fe7 --- /dev/null +++ b/IoT/UI/ApplicationControl/ApplicationControl/Models/ApplicationListItem.cs @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.ComponentModel; +using Tizen.NUI; + +namespace ApplicationControl.Models +{ + /// + /// A class for an application list item + /// + public class ApplicationListItem : INotifyPropertyChanged + { + Color _blendColor; + + /// + /// The application ID + /// + public string Id { get; set; } + + /// + /// The icon path + /// + public string IconPath { get; set; } + + /// + /// The color be blended with an image + /// + public Color BlendColor + { + get + { + return _blendColor; + } + + set + { + if (_blendColor == value) + { + return; + } + + _blendColor = value; + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("BlendColor")); + } + } + + public event PropertyChangedEventHandler PropertyChanged; + } +} diff --git a/IoT/UI/ApplicationControl/ApplicationControl/Models/Message.cs b/IoT/UI/ApplicationControl/ApplicationControl/Models/Message.cs new file mode 100755 index 000000000..bb41e7863 --- /dev/null +++ b/IoT/UI/ApplicationControl/ApplicationControl/Models/Message.cs @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +namespace ApplicationControl.Models +{ + /// + /// A class for a composed message will be sent + /// + public class Message + { + /// + /// A constructor for the Message class + /// + public Message() + { + Initialize(); + } + + /// + /// An email address to send + /// + public string To { get; set; } + + /// + /// An Subject for the message + /// + public string Subject { get; set; } + + /// + /// An text content to send + /// + public string Text { get; set; } + + void Initialize() + { + Subject = "Message from appcontrol"; + Text = "Dear Developer,\n\nThis is the default message sent from\nappcontrol sample application.\nFeel free to modify this text message in email composer.\n\nBest Regards."; + } + } +} diff --git a/IoT/UI/ApplicationControl/ApplicationControl/Pages/MainPage.cs b/IoT/UI/ApplicationControl/ApplicationControl/Pages/MainPage.cs new file mode 100755 index 000000000..fdfcccf59 --- /dev/null +++ b/IoT/UI/ApplicationControl/ApplicationControl/Pages/MainPage.cs @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using Tizen.NUI; +using Tizen.NUI.BaseComponents; +using Tizen.NUI.Components; +using ApplicationControl.ViewModels; +using ApplicationControl.Views; + +namespace ApplicationControl.Pages +{ + /// + /// Main page for ApplicationControl + /// + public class MainPage : ContentPage + { + private MainViewModel _viewModel; + private OperationLayout _operationLayout; + private ApplicationLayout _applicationLayout; + private ComposeLayout _composeLayout; + + public MainPage() + { + _viewModel = new MainViewModel(); + InitializeComponent(); + } + + void InitializeComponent() + { + // Set page background + BackgroundColor = Resources.BackgroundLight; + + // Get screen dimensions + var window = NUIApplication.GetDefaultWindow(); + var screenWidth = (int)window.WindowSize.Width; + var screenHeight = (int)window.WindowSize.Height; + + // Horizontal layout for landscape view + // Left panel: Operation selection (30%) + // Right panel: Application list and compose (70%) + var mainLayout = new View + { + Layout = new LinearLayout + { + LinearOrientation = LinearLayout.Orientation.Horizontal, + CellPadding = new Size2D(Resources.Dimensions.Padding, 0) + }, + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.MatchParent, + Padding = new Extents((ushort)Resources.Dimensions.Padding, (ushort)Resources.Dimensions.Padding, + (ushort)Resources.Dimensions.Padding, (ushort)Resources.Dimensions.Padding) + }; + + // Left Panel: Operation Selection + _operationLayout = new OperationLayout(_viewModel) + { + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.MatchParent, + Weight = 0.3f + }; + + // Right Panel Container + var rightPanel = new View + { + Layout = new LinearLayout + { + LinearOrientation = LinearLayout.Orientation.Vertical, + CellPadding = new Size2D(0, Resources.Dimensions.Padding) + }, + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.MatchParent, + Weight = 0.7f + }; + + // Application List (60% of right panel) + _applicationLayout = new ApplicationLayout(_viewModel, screenWidth, screenHeight) + { + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.MatchParent, + Weight = 0.6f + }; + + // Compose Section (40% of right panel) + _composeLayout = new ComposeLayout(_viewModel) + { + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.MatchParent, + Weight = 0.4f + }; + + rightPanel.Add(_applicationLayout); + rightPanel.Add(_composeLayout); + + // Add panels to main layout + mainLayout.Add(_operationLayout); + mainLayout.Add(rightPanel); + + // Set content + Content = mainLayout; + + // Set AppBar + AppBar = new AppBar + { + Title = "Application Control", + AutoNavigationContent = false + }; + } + } +} diff --git a/IoT/UI/ApplicationControl/ApplicationControl/Resources.cs b/IoT/UI/ApplicationControl/ApplicationControl/Resources.cs new file mode 100755 index 000000000..cd77c6ea1 --- /dev/null +++ b/IoT/UI/ApplicationControl/ApplicationControl/Resources.cs @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Tizen.NUI; +using Tizen.NUI.BaseComponents; +using Tizen.NUI.Components; + +namespace ApplicationControl +{ + /// + /// Static resource class for ApplicationControl + /// + internal static class Resources + { + // Colors - Modern Color Scheme + public static readonly Color White = new Color(1.0f, 1.0f, 1.0f, 1.0f); + public static readonly Color Black = new Color(0.0f, 0.0f, 0.0f, 1.0f); + public static readonly Color Gray = new Color(0.5f, 0.5f, 0.5f, 1.0f); + public static readonly Color LightGray = new Color(0.95f, 0.95f, 0.95f, 1.0f); + public static readonly Color DarkGray = new Color(0.3f, 0.3f, 0.3f, 1.0f); + public static readonly Color Transparent = new Color(0.0f, 0.0f, 0.0f, 0.0f); + + // Primary Colors + public static readonly Color PrimaryBlue = new Color(0.26f, 0.52f, 0.96f, 1.0f); // #4285F4 + public static readonly Color PrimaryBlueDark = new Color(0.2f, 0.4f, 0.8f, 1.0f); + public static readonly Color PrimaryBlueLight = new Color(0.67f, 0.8f, 0.98f, 1.0f); + + // Accent Colors + public static readonly Color AccentGreen = new Color(0.2f, 0.73f, 0.29f, 1.0f); // #34BA52 + public static readonly Color AccentRed = new Color(0.92f, 0.26f, 0.21f, 1.0f); // #EA4335 + public static readonly Color AccentOrange = new Color(1.0f, 0.67f, 0.0f, 1.0f); // #FFAB00 + + // Background Colors + public static readonly Color BackgroundLight = new Color(0.98f, 0.98f, 0.98f, 1.0f); + public static readonly Color CardBackground = new Color(1.0f, 1.0f, 1.0f, 1.0f); + public static readonly Color SectionBackground = new Color(0.96f, 0.96f, 0.96f, 1.0f); + + // Text Colors + public static readonly Color TextPrimary = new Color(0.13f, 0.13f, 0.13f, 1.0f); + public static readonly Color TextSecondary = new Color(0.45f, 0.45f, 0.45f, 1.0f); + public static readonly Color TextHint = new Color(0.62f, 0.62f, 0.62f, 1.0f); + + // State Colors + public static readonly Color PressedColor = new Color(0.0f, 0.0f, 0.0f, 0.1f); + public static readonly Color SelectedColor = new Color(0.26f, 0.52f, 0.96f, 0.15f); + public static readonly Color HoverColor = new Color(0.0f, 0.0f, 0.0f, 0.05f); + + // Dimensions + public static class Dimensions + { + public const int Padding = 16; + public const int PaddingSmall = 8; + public const int PaddingLarge = 24; + public const int CornerRadius = 8; + public const int ButtonHeight = 48; + public const int CardElevation = 4; + } + + // Font Sizes + public static class FontSizes + { + public const float Title = 24.0f; + public const float Subtitle = 18.0f; + public const float Body = 16.0f; + public const float Caption = 14.0f; + public const float Small = 12.0f; + } + + // Helper Methods + public static Shadow CreateShadow() + { + return new Shadow(2.0f, new Color(0, 0, 0, 0.2f), new Vector2(0, 2)); + } + + public static View CreateCard() + { + return new View + { + BackgroundColor = CardBackground, + CornerRadius = Dimensions.CornerRadius, + BoxShadow = new Shadow(Dimensions.CardElevation, new Color(0, 0, 0, 0.1f), new Vector2(0, 2)) + }; + } + + public static Button CreatePrimaryButton(string text) + { + return new Button + { + Text = text, + BackgroundColor = PrimaryBlue, + TextColor = White, + CornerRadius = Dimensions.CornerRadius / 2, + HeightSpecification = Dimensions.ButtonHeight, + PointSize = FontSizes.Caption, + }; + } + + public static Button CreateSecondaryButton(string text, Color color) + { + return new Button + { + Text = text, + BackgroundColor = color, + TextColor = White, + CornerRadius = Dimensions.CornerRadius / 2, + HeightSpecification = Dimensions.ButtonHeight, + PointSize = FontSizes.Body + }; + } + } +} diff --git a/IoT/UI/ApplicationControl/ApplicationControl/ViewModels/MainViewModel.cs b/IoT/UI/ApplicationControl/ApplicationControl/ViewModels/MainViewModel.cs new file mode 100755 index 000000000..a08c095fb --- /dev/null +++ b/IoT/UI/ApplicationControl/ApplicationControl/ViewModels/MainViewModel.cs @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.ObjectModel; +using System.ComponentModel; +using Tizen.NUI; +using ApplicationControl.Models; +using ApplicationControl.Helpers; + +namespace ApplicationControl.ViewModels +{ + /// + /// A class for main view model + /// + public class MainViewModel : INotifyPropertyChanged + { + ObservableCollection _applications; + Message _message; + AppControlType _selectedAppControlType; + ApplicationListItem _selectedItem; + + /// + /// A constructor for the MainViewModel class + /// + public MainViewModel() + { + Initialize(); + } + + /// + /// To execute the selected application + /// + public void ExecuteSelectedApplication() + { + if (SelectedItem == null || SelectedItem?.Id == null || SelectedAppControlType == AppControlType.Unknown) + { + return; + } + + Console.WriteLine($"Execute id:{SelectedItem.Id}, type:{SelectedAppControlType}"); + ApplicationControlHelper.ExecuteApplication(SelectedAppControlType, SelectedItem.Id); + } + + /// + /// To kill the selected application + /// + public void KillSelectedApplication() + { + if (SelectedItem == null || SelectedItem?.Id == null) + { + return; + } + + ApplicationControlHelper.KillApplication(SelectedItem.Id); + } + + /// + /// To send a message + /// + public void SendMessage() + { + ApplicationControlHelper.ExecuteApplication(AppControlType.Send, null, Message); + } + + /// + /// The selected application control type + /// + public AppControlType SelectedAppControlType + { + get + { + return _selectedAppControlType; + } + + set + { + if (_selectedAppControlType == value) + { + return; + } + + _selectedAppControlType = value; + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("SelectedAppControlType")); + } + } + + /// + /// Applications information for a specific application control + /// + public ObservableCollection Applications + { + get + { + return _applications; + } + } + + /// + /// The selected application item on the application list + /// + public ApplicationListItem SelectedItem + { + get + { + return _selectedItem; + } + + set + { + if (_selectedItem == value) + { + return; + } + + if (_selectedItem != null) + { + _selectedItem.BlendColor = Resources.Gray; + } + + _selectedItem = value; + if (_selectedItem != null) + { + _selectedItem.BlendColor = Resources.Transparent; + } + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("SelectedItem")); + } + } + + /// + /// A Message to send + /// + public Message Message + { + get + { + return _message; + } + } + + /// + /// To initialize some fields when the class is instantiated + /// + void Initialize() + { + _applications = new ObservableCollection(); + _message = new Message { }; + _selectedAppControlType = AppControlType.Unknown; + _selectedItem = new ApplicationListItem { Id = null }; + } + + public event PropertyChangedEventHandler PropertyChanged; + } +} diff --git a/IoT/UI/ApplicationControl/ApplicationControl/Views/ApplicationLayout.cs b/IoT/UI/ApplicationControl/ApplicationControl/Views/ApplicationLayout.cs new file mode 100755 index 000000000..e0d8434e6 --- /dev/null +++ b/IoT/UI/ApplicationControl/ApplicationControl/Views/ApplicationLayout.cs @@ -0,0 +1,311 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.ComponentModel; +using System.Threading.Tasks; +using Tizen.NUI; +using Tizen.NUI.BaseComponents; +using Tizen.NUI.Components; +using ApplicationControl.ViewModels; +using ApplicationControl.Helpers; +using ApplicationControl.Models; + +namespace ApplicationControl.Views +{ + /// + /// A class for an application list layout as a part of the main layout + /// + public class ApplicationLayout : View + { + private MainViewModel _viewModel; + private ScrollableBase _scrollView; + private View _applicationsContainer; + private TextLabel _emptyStateLabel; + + public ApplicationLayout(MainViewModel viewModel, int screenWidth, int screenHeight) + { + _viewModel = viewModel; + + BackgroundColor = Resources.CardBackground; + CornerRadius = Resources.Dimensions.CornerRadius; + BoxShadow = new Shadow(Resources.Dimensions.CardElevation, new Color(0, 0, 0, 0.1f), new Vector2(0, 2)); + + Layout = new LinearLayout + { + LinearOrientation = LinearLayout.Orientation.Vertical, + CellPadding = new Size2D(0, Resources.Dimensions.Padding) + }; + + Padding = new Extents((ushort)Resources.Dimensions.Padding, (ushort)Resources.Dimensions.Padding, + (ushort)Resources.Dimensions.Padding, (ushort)Resources.Dimensions.Padding); + + SetPropertyChangeListener(); + InitializeComponent(); + } + + void InitializeComponent() + { + // Header + var header = new View + { + Layout = new LinearLayout + { + LinearOrientation = LinearLayout.Orientation.Horizontal, + VerticalAlignment = VerticalAlignment.Center, + }, + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.WrapContent + }; + + var title = new TextLabel + { + Text = "Applications", + PointSize = Resources.FontSizes.Title, + TextColor = Resources.TextPrimary, + FontStyle = new PropertyMap().Add("weight", new PropertyValue("bold")), + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.WrapContent, + Weight = 1.0f + }; + header.Add(title); + Add(header); + + // Scrollable container for applications + _scrollView = new ScrollableBase + { + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.MatchParent, + Weight = 1.0f, + ScrollingDirection = ScrollableBase.Direction.Vertical, + HideScrollbar = false + }; + + _applicationsContainer = new View + { + Layout = new LinearLayout + { + LinearOrientation = LinearLayout.Orientation.Vertical, + CellPadding = new Size2D(0, Resources.Dimensions.PaddingSmall) + }, + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.WrapContent + }; + + _scrollView.Add(_applicationsContainer); + Add(_scrollView); + + // Empty state + _emptyStateLabel = new TextLabel + { + Text = "Select an operation type to view applications", + PointSize = Resources.FontSizes.Body, + TextColor = Resources.TextHint, + HorizontalAlignment = HorizontalAlignment.Center, + VerticalAlignment = VerticalAlignment.Center, + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.MatchParent, + MultiLine = true + }; + _applicationsContainer.Add(_emptyStateLabel); + + // Action buttons + var buttonContainer = new View + { + Layout = new LinearLayout + { + LinearOrientation = LinearLayout.Orientation.Horizontal, + CellPadding = new Size2D(Resources.Dimensions.Padding, 0) + }, + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.WrapContent + }; + + var executeButton = Resources.CreateSecondaryButton("Execute", Resources.AccentGreen); + executeButton.Weight = 1.0f; + executeButton.Clicked += (s, e) => + { + _viewModel.ExecuteSelectedApplication(); + }; + + var killButton = Resources.CreateSecondaryButton("Kill", Resources.AccentRed); + killButton.Weight = 1.0f; + killButton.Clicked += (s, e) => + { + _viewModel.KillSelectedApplication(); + }; + + buttonContainer.Add(executeButton); + buttonContainer.Add(killButton); + Add(buttonContainer); + } + + void SetPropertyChangeListener() + { + _viewModel.PropertyChanged += OnPropertyChanged; + } + + async void OnPropertyChanged(object s, PropertyChangedEventArgs e) + { + if (e.PropertyName == "SelectedAppControlType") + { + _viewModel.Applications.Clear(); + await UpdateContentLayout(); + } + } + + Task UpdateContentLayout() + { + return Task.Run(() => + { + // Clear existing items + _applicationsContainer.Children.Clear(); + + var selected = _viewModel.SelectedAppControlType; + if (selected == AppControlType.Unknown) + { + // Show empty state + _applicationsContainer.Add(_emptyStateLabel); + return; + } + + var apps = ApplicationControlHelper.GetApplicationIdsForSpecificAppControlType(selected); + + foreach (var app in apps) + { + var iconPath = ApplicationControlHelper.GetApplicationIconPath(app); + + var appItem = new ApplicationListItem + { + Id = app, + IconPath = iconPath, + BlendColor = Resources.Gray, + }; + _viewModel.Applications.Add(appItem); + + var appLayoutItem = CreateApplicationLayoutItem(appItem); + _applicationsContainer.Add(appLayoutItem); + } + }); + } + + View CreateApplicationLayoutItem(ApplicationListItem item) + { + var container = new View + { + Layout = new LinearLayout + { + LinearOrientation = LinearLayout.Orientation.Horizontal, + LinearAlignment = LinearLayout.Alignment.CenterVertical, + CellPadding = new Size2D(Resources.Dimensions.Padding, 0) + }, + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = 72, + BackgroundColor = Resources.CardBackground, + Padding = new Extents((ushort)Resources.Dimensions.Padding, (ushort)Resources.Dimensions.Padding, + (ushort)Resources.Dimensions.PaddingSmall, (ushort)Resources.Dimensions.PaddingSmall) + }; + + // Icon + View iconContainer; + if (!string.IsNullOrEmpty(item.IconPath)) + { + iconContainer = new ImageView + { + ResourceUrl = item.IconPath, + WidthSpecification = 48, + HeightSpecification = 48, + CornerRadius = 24 + }; + } + else + { + // Placeholder icon + iconContainer = new View + { + BackgroundColor = Resources.LightGray, + WidthSpecification = 48, + HeightSpecification = 48, + CornerRadius = 24 + }; + } + + // Text container + var textContainer = new View + { + Layout = new LinearLayout + { + LinearOrientation = LinearLayout.Orientation.Vertical, + CellPadding = new Size2D(0, 2) + }, + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.WrapContent, + Weight = 1.0f + }; + + var appIdLabel = new TextLabel + { + Text = item.Id ?? "Unknown", + PointSize = Resources.FontSizes.Body, + TextColor = Resources.TextPrimary, + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.WrapContent, + Ellipsis = true + }; + + textContainer.Add(appIdLabel); + + container.Add(iconContainer); + container.Add(textContainer); + + // Selection indicator + var indicator = new View + { + BackgroundColor = Resources.Transparent, + WidthSpecification = 4, + HeightSpecification = LayoutParamPolicies.MatchParent, + CornerRadius = 2 + }; + container.Add(indicator); + + // Touch handling + container.TouchEvent += (sender, e) => + { + if (e.Touch.GetState(0) == PointStateType.Down) + { + container.BackgroundColor = Resources.HoverColor; + } + else if (e.Touch.GetState(0) == PointStateType.Up) + { + container.BackgroundColor = Resources.CardBackground; + + // Update selection + foreach (var app in _viewModel.Applications) + { + if (app.Id == item.Id) + { + _viewModel.SelectedItem = app; + indicator.BackgroundColor = Resources.PrimaryBlue; + } + } + } + return false; + }; + + return container; + } + } +} diff --git a/IoT/UI/ApplicationControl/ApplicationControl/Views/ComposeLayout.cs b/IoT/UI/ApplicationControl/ApplicationControl/Views/ComposeLayout.cs new file mode 100755 index 000000000..abff76fe7 --- /dev/null +++ b/IoT/UI/ApplicationControl/ApplicationControl/Views/ComposeLayout.cs @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Tizen.NUI; +using Tizen.NUI.BaseComponents; +using Tizen.NUI.Components; +using ApplicationControl.ViewModels; + +namespace ApplicationControl.Views +{ + /// + /// A class for a compose layout as a part of the main layout + /// + public class ComposeLayout : View + { + private MainViewModel _viewModel; + + public ComposeLayout(MainViewModel viewModel) + { + _viewModel = viewModel; + + BackgroundColor = Resources.CardBackground; + CornerRadius = Resources.Dimensions.CornerRadius; + BoxShadow = new Shadow(Resources.Dimensions.CardElevation, new Color(0, 0, 0, 0.1f), new Vector2(0, 2)); + + Layout = new LinearLayout + { + LinearOrientation = LinearLayout.Orientation.Vertical, + CellPadding = new Size2D(0, Resources.Dimensions.Padding) + }; + + Padding = new Extents((ushort)Resources.Dimensions.Padding, (ushort)Resources.Dimensions.Padding, + (ushort)Resources.Dimensions.Padding, (ushort)Resources.Dimensions.Padding); + + InitializeComponent(); + } + + void InitializeComponent() + { + // Header + var title = new TextLabel + { + Text = "Compose Message", + PointSize = Resources.FontSizes.Title, + TextColor = Resources.TextPrimary, + FontStyle = new PropertyMap().Add("weight", new PropertyValue("bold")), + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.WrapContent + }; + Add(title); + + // Message preview + var messageContainer = new View + { + BackgroundColor = Resources.SectionBackground, + CornerRadius = Resources.Dimensions.CornerRadius / 2, + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.MatchParent, + Weight = 1.0f, + Padding = new Extents((ushort)Resources.Dimensions.Padding, (ushort)Resources.Dimensions.Padding, + (ushort)Resources.Dimensions.Padding, (ushort)Resources.Dimensions.Padding) + }; + + var messageLabel = new TextLabel + { + Text = _viewModel.Message.Text, + TextColor = Resources.TextSecondary, + PointSize = Resources.FontSizes.Caption, + MultiLine = true, + LineWrapMode = LineWrapMode.Word, + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.MatchParent + }; + messageContainer.Add(messageLabel); + Add(messageContainer); + + // Input section + var inputContainer = new View + { + Layout = new LinearLayout + { + LinearOrientation = LinearLayout.Orientation.Horizontal, + CellPadding = new Size2D(Resources.Dimensions.Padding, 0) + }, + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.WrapContent + }; + + var addressEntry = new TextField + { + PlaceholderText = "Recipient email address", + BackgroundColor = Resources.LightGray, + TextColor = Resources.TextPrimary, + PlaceholderTextColor = Resources.TextHint, + PointSize = Resources.FontSizes.Body, + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = Resources.Dimensions.ButtonHeight, + Weight = 1.0f, + Padding = new Extents((ushort)Resources.Dimensions.Padding, (ushort)Resources.Dimensions.Padding, 0, 0), + CornerRadius = Resources.Dimensions.CornerRadius / 2 + }; + + addressEntry.TextChanged += (s, e) => + { + _viewModel.Message.To = e.TextField.Text; + }; + + var sendButton = Resources.CreatePrimaryButton("Send"); + sendButton.WidthSpecification = 120; + sendButton.Clicked += (s, e) => + { + _viewModel.SendMessage(); + }; + + inputContainer.Add(addressEntry); + inputContainer.Add(sendButton); + Add(inputContainer); + } + } +} diff --git a/IoT/UI/ApplicationControl/ApplicationControl/Views/OperationLayout.cs b/IoT/UI/ApplicationControl/ApplicationControl/Views/OperationLayout.cs new file mode 100755 index 000000000..d9b278c45 --- /dev/null +++ b/IoT/UI/ApplicationControl/ApplicationControl/Views/OperationLayout.cs @@ -0,0 +1,203 @@ +/* + * Copyright (c) 2017 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using Tizen.NUI; +using Tizen.NUI.BaseComponents; +using Tizen.NUI.Components; +using ApplicationControl.ViewModels; +using ApplicationControl.Helpers; + +namespace ApplicationControl.Views +{ + /// + /// A class for an operation layout as a part of the main layout + /// + public class OperationLayout : View + { + private MainViewModel _viewModel; + private RadioButtonGroup _radioGroup; + + public OperationLayout(MainViewModel viewModel) + { + _viewModel = viewModel; + BackgroundColor = Resources.CardBackground; + CornerRadius = Resources.Dimensions.CornerRadius; + BoxShadow = new Shadow(Resources.Dimensions.CardElevation, new Color(0, 0, 0, 0.1f), new Vector2(0, 2)); + + Layout = new LinearLayout + { + LinearOrientation = LinearLayout.Orientation.Vertical, + CellPadding = new Size2D(0, Resources.Dimensions.PaddingSmall) + }; + + Padding = new Extents((ushort)Resources.Dimensions.Padding, (ushort)Resources.Dimensions.Padding, + (ushort)Resources.Dimensions.Padding, (ushort)Resources.Dimensions.Padding); + + // Create RadioButtonGroup for mutual exclusion + _radioGroup = new RadioButtonGroup(); + + InitializeComponent(); + } + + void InitializeComponent() + { + // Title + var title = new TextLabel + { + Text = "Operation Type", + PointSize = Resources.FontSizes.Title, + TextColor = Resources.TextPrimary, + FontStyle = new PropertyMap().Add("weight", new PropertyValue("bold")), + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.WrapContent, + Margin = new Extents(0, 0, 0, (ushort)Resources.Dimensions.Padding) + }; + Add(title); + + // Subtitle + var subtitle = new TextLabel + { + Text = "Select an operation to view matching applications", + PointSize = Resources.FontSizes.Caption, + TextColor = Resources.TextSecondary, + MultiLine = true, + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.WrapContent, + Margin = new Extents(0, 0, 0, (ushort)Resources.Dimensions.PaddingLarge) + }; + Add(subtitle); + + // Create operation items + Add(CreateOperationItem("View", "Open and view content", AppControlType.View, Resources.PrimaryBlue)); + Add(CreateOperationItem("Pick", "Select files or data", AppControlType.Pick, Resources.AccentOrange)); + Add(CreateOperationItem("Compose", "Create new content", AppControlType.Compose, Resources.AccentGreen)); + } + + View CreateOperationItem(string title, string description, AppControlType type, Color accentColor) + { + var container = new View + { + Layout = new LinearLayout + { + LinearOrientation = LinearLayout.Orientation.Horizontal, + LinearAlignment = LinearLayout.Alignment.CenterVertical, + CellPadding = new Size2D(Resources.Dimensions.Padding, 0) + }, + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.WrapContent, + Margin = new Extents(0, 0, 0, (ushort)Resources.Dimensions.PaddingSmall) + }; + + // Radio Button + var radioButton = new RadioButton + { + IsSelected = false, + WidthSpecification = 24, + HeightSpecification = 24 + }; + + // Add to RadioButtonGroup for mutual exclusion + _radioGroup.Add(radioButton); + + radioButton.SelectedChanged += (s, e) => + { + if (e.IsSelected == false) + { + return; + } + + // Update selected item if type changes + if (type != _viewModel.SelectedAppControlType) + { + if (_viewModel.SelectedItem != null) + { + _viewModel.SelectedItem.Id = null; + } + } + + _viewModel.SelectedAppControlType = type; + }; + + // Text container + var textContainer = new View + { + Layout = new LinearLayout + { + LinearOrientation = LinearLayout.Orientation.Vertical, + CellPadding = new Size2D(0, 4) + }, + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.WrapContent, + Weight = 1.0f + }; + + // Title + var titleLabel = new TextLabel + { + Text = title, + PointSize = Resources.FontSizes.Body, + TextColor = Resources.TextPrimary, + FontStyle = new PropertyMap().Add("weight", new PropertyValue("medium")), + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.WrapContent + }; + + // Description + var descLabel = new TextLabel + { + Text = description, + PointSize = Resources.FontSizes.Small, + TextColor = Resources.TextSecondary, + WidthSpecification = LayoutParamPolicies.MatchParent, + HeightSpecification = LayoutParamPolicies.WrapContent + }; + + textContainer.Add(titleLabel); + textContainer.Add(descLabel); + + // Accent indicator + var indicator = new View + { + BackgroundColor = accentColor, + WidthSpecification = 4, + HeightSpecification = LayoutParamPolicies.MatchParent, + CornerRadius = 2 + }; + + container.Add(radioButton); + container.Add(textContainer); + container.Add(indicator); + + // Add touch feedback + container.TouchEvent += (sender, e) => + { + if (e.Touch.GetState(0) == PointStateType.Down) + { + container.BackgroundColor = Resources.HoverColor; + } + else if (e.Touch.GetState(0) == PointStateType.Up) + { + container.BackgroundColor = Resources.Transparent; + radioButton.IsSelected = true; + } + return false; + }; + + return container; + } + } +} diff --git a/IoT/UI/ApplicationControl/ApplicationControl/shared/res/ApplicationControl.png b/IoT/UI/ApplicationControl/ApplicationControl/shared/res/ApplicationControl.png new file mode 100755 index 0000000000000000000000000000000000000000..9f3cb98608134e7b9eb4beb7394fec9f03e40f63 GIT binary patch literal 10097 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 TJbOA100000NkvXXu0mjf?x(Kf literal 0 HcmV?d00001 diff --git a/IoT/UI/ApplicationControl/ApplicationControl/tizen-manifest.xml b/IoT/UI/ApplicationControl/ApplicationControl/tizen-manifest.xml new file mode 100755 index 000000000..2ed4429ed --- /dev/null +++ b/IoT/UI/ApplicationControl/ApplicationControl/tizen-manifest.xml @@ -0,0 +1,22 @@ + + + + + + ApplicationControl.png + + + + http://tizen.org/privilege/appmanager.launch + http://tizen.org/privilege/appmanager.kill + http://tizen.org/privilege/packagemanager.info + +