+++ /dev/null
-using System;\r
-using System.ComponentModel;\r
-using System.Collections.Generic;\r
-using System.Collections.ObjectModel;\r
-using Tizen;\r
-using Tizen.NUI.BaseComponents;\r
-using Tizen.NUI.Components;\r
-using Tizen.NUI.Binding;\r
-using Tizen.Network.WiFi;\r
-\r
-\r
-namespace SettingWiFi\r
-{\r
- public class AP : INotifyPropertyChanged\r
- {\r
- string iconDir = Tizen.Applications.Application.Current.DirectoryInfo.Resource + "icon.png";\r
- private string essid;\r
- private string state;\r
-\r
- public event PropertyChangedEventHandler PropertyChanged;\r
-\r
- private void OnPropertyChanged(string propertyName)\r
- {\r
- Log.Debug(Program.LogTag, "OnPropertyChanged");\r
- PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));\r
- }\r
-\r
- public AP(string apEssid, string apState)\r
- {\r
- essid = apEssid;\r
- state = apState;\r
- }\r
-\r
- public string Essid\r
- {\r
- get\r
- {\r
- return essid;\r
- }\r
- set\r
- {\r
- essid = value;\r
- OnPropertyChanged("Essid");\r
- }\r
- }\r
-\r
- public string ImageUrl\r
- {\r
- get\r
- {\r
- return iconDir;\r
- }\r
- }\r
-\r
- public string State\r
- {\r
- get\r
- {\r
- return state;\r
- }\r
- set\r
- {\r
- state = value;\r
- OnPropertyChanged("State");\r
- }\r
- }\r
- };\r
-\r
- public class DeviceCollection : ObservableCollection<AP>\r
- {\r
- private string title;\r
-\r
- public DeviceCollection(string groupTitle)\r
- {\r
- title = groupTitle;\r
- this.UpdateScanList(null);\r
- }\r
-\r
- public string Title\r
- {\r
- get\r
- {\r
- return title;\r
- }\r
- set\r
- {\r
- title = value;\r
- OnPropertyChanged(new PropertyChangedEventArgs("Title"));\r
- }\r
- }\r
-\r
- public void UpdateScanList(List<AP> apList)\r
- {\r
- if (apList == null)\r
- {\r
- Log.Debug(Program.LogTag, "apList is null");\r
- this.Add(new AP("", ""));\r
- return;\r
- }\r
- // Clear method have some issue about asynchronous actions,\r
- // so call Remove for all item is recommanded.\r
- while (this.Count > 0)\r
- {\r
- this.RemoveAt(this.Count - 1);\r
- }\r
-\r
- foreach (var item in apList)\r
- {\r
- this.Add(new AP(item.Essid, item.State));\r
- }\r
- }\r
-\r
- public void RemoveDevices()\r
- {\r
- while (this.Count > 0)\r
- {\r
- this.RemoveAt(this.Count - 1);\r
- }\r
- }\r
- }\r
-\r
- public class APSource : ObservableCollection<DeviceCollection>\r
- {\r
- private DeviceCollection available;\r
- public APSource()\r
- {\r
- Log.Debug(Program.LogTag, "new APSource");\r
- available = new DeviceCollection("Available networks");\r
- this.Add(available);\r
- Log.Debug(Program.LogTag, "Add DeviceCollection");\r
- }\r
- public void UpdateScanList(List<AP> apList)\r
- {\r
- available.UpdateScanList(apList);\r
- }\r
-\r
- public void RemoveDevices()\r
- {\r
- available.RemoveDevices();\r
- }\r
- }\r
-}
\ No newline at end of file
namespace SettingWiFi
{
- public class Program : NUIWidgetApplication
+ public class SettingWiFi : NUIWidgetApplication
{
- internal static readonly string LogTag = "SettingWiFi.App";
- public Program(Dictionary<System.Type, string> widgetSet) : base(widgetSet)
+ public SettingWiFi(Dictionary<System.Type, string> widgetSet) : base(widgetSet)
{
}
{
Dictionary<System.Type, string> widgetSet = new Dictionary<Type, string>();
widgetSet.Add(typeof(WidgetSettingWiFi), "wifi@org.tizen.cssetting-wifi");
- var app = new Program(widgetSet);
+ var app = new SettingWiFi(widgetSet);
app.Run(args);
}
}
+++ /dev/null
-using System;\r
-using System.Collections.Generic;\r
-using System.Text;\r
-using System.Threading.Tasks;\r
-using Tizen;\r
-using Tizen.Network.WiFi;\r
-\r
-namespace SettingWiFi\r
-{\r
- public class WiFi\r
- {\r
- IEnumerable<WiFiAP> apList = new List<WiFiAP>();\r
-\r
- public async Task Activate()\r
- {\r
- try\r
- {\r
- await WiFiManager.ActivateAsync();\r
- }\r
- catch (Exception e)\r
- {\r
- Log.Debug(Program.LogTag, "Fail to activate WiFi " + e.ToString());\r
- }\r
- }\r
-\r
- public Task Deactivate()\r
- {\r
- return WiFiManager.DeactivateAsync();\r
- }\r
-\r
- public async Task Scan()\r
- {\r
- try\r
- {\r
- await WiFiManager.ScanAsync();\r
- }\r
- catch (Exception e)\r
- {\r
- Log.Debug(Program.LogTag, "Fail to scan " + e.ToString());\r
- }\r
- }\r
-\r
- public List<AP> GetScanResult()\r
- {\r
- try\r
- {\r
- apList = WiFiManager.GetFoundAPs();\r
- return GetAPList();\r
- }\r
- catch (Exception e)\r
- {\r
- Log.Debug(Program.LogTag, "Fail to get scan result " + e.ToString());\r
- }\r
-\r
- return null;\r
- }\r
-\r
- public async Task Connect(string essid, string password)\r
- {\r
- WiFiAP ap = FindAP(essid);\r
- if (ap == null)\r
- {\r
- Log.Debug(Program.LogTag, "Cannet find " + essid);\r
- return;\r
- }\r
-\r
- if (password.Length > 0)\r
- {\r
- ap.SecurityInformation.SetPassphrase(password);\r
- }\r
-\r
- try\r
- {\r
- await ap.ConnectAsync();\r
- }\r
- catch (Exception e)\r
- {\r
- Log.Debug(Program.LogTag, "Fail to connect" + e.ToString());\r
- }\r
-\r
- }\r
-\r
- public Task Disconnect(string essid)\r
- {\r
- WiFiAP ap = FindAP(essid);\r
- if (ap == null)\r
- {\r
- return Task.FromException(new ArgumentException("Cannot find " + essid));\r
- }\r
- return ap.DisconnectAsync();\r
- }\r
-\r
- public void Forget(string essid)\r
- {\r
- WiFiAP ap = FindAP(essid);\r
- if (ap == null)\r
- {\r
- Log.Debug(Program.LogTag, "Cannot find " + essid);\r
- return;\r
- }\r
- ap.ForgetAP();\r
- }\r
-\r
- private WiFiAP FindAP(string essid)\r
- {\r
- GetScanResult();\r
- foreach (var item in apList)\r
- {\r
- Log.Debug(Program.LogTag, "Found AP\t" + item.NetworkInformation.Essid);\r
- if (item.NetworkInformation.Essid.Equals(essid))\r
- {\r
- return item;\r
- }\r
- }\r
-\r
- return null;\r
- }\r
-\r
- public bool IsActive()\r
- {\r
- if (WiFiManager.IsActive)\r
- {\r
- return true;\r
- }\r
-\r
- return false;\r
- }\r
-\r
- public string GetConnectedAP()\r
- {\r
- return WiFiManager.GetConnectedAP().NetworkInformation.Essid;\r
- }\r
-\r
- public List<AP> GetAPList()\r
- {\r
- List<AP> apInfoList = new List<AP>();\r
- foreach (var item in apList)\r
- {\r
- Log.Debug(Program.LogTag, "AP name: " + item.NetworkInformation.Essid);\r
- Log.Debug(Program.LogTag, "AP connection state: " + item.NetworkInformation.ConnectionState.ToString());\r
-\r
- string connectionState = item.NetworkInformation.ConnectionState.ToString();\r
- string securityType = item.SecurityInformation.SecurityType.ToString();\r
- //bool isPassphraseRequired = item.SecurityInformation.IsPassphraseRequired;\r
- bool isWpsSupported = item.SecurityInformation.IsWpsSupported;\r
-\r
- if (item.NetworkInformation.ConnectionState.ToString().Equals("Connected"))\r
- {\r
- apInfoList.Add(new AP(item.NetworkInformation.Essid, "Connected"));\r
- continue;\r
- }\r
- string text = "";\r
-\r
- if (securityType.Equals("None"))\r
- {\r
- text = "Open";\r
- }\r
- else if (securityType.Equals("Eap"))\r
- {\r
- text = "Secured (Eap)";\r
- }\r
- else if (isWpsSupported)\r
- {\r
- text = "Secured (WPS available)";\r
- }\r
- else\r
- {\r
- text = "Secured";\r
- }\r
-\r
- apInfoList.Add(new AP(item.NetworkInformation.Essid, text));\r
- }\r
-\r
- return apInfoList;\r
- }\r
- }\r
-}\r
+++ /dev/null
-using System;\r
-using System.Collections.Generic;\r
-using Tizen;\r
-using Tizen.Applications;\r
-using Tizen.NUI;\r
-using Tizen.NUI.Accessibility;\r
-using Tizen.NUI.BaseComponents;\r
-using Tizen.NUI.Binding;\r
-using Tizen.NUI.Components;\r
-\r
-\r
-namespace SettingWiFi\r
-{\r
- internal class WidgetSettingWiFi : Widget\r
- {\r
- CollectionView scanList;\r
- Navigator navigator;\r
-\r
- ContentPage mainPage;\r
- ContentPage infoPage;\r
- ContentPage morePage;\r
-\r
- WiFi wifi;\r
- APSource apSource;\r
-\r
- private static readonly int itemCount = 1;\r
- private MenuItem[] menuItems = new MenuItem[itemCount];\r
-\r
- private RecyclerViewItem GetHeader()\r
- {\r
- var header = new RecyclerViewItem()\r
- {\r
- Layout = new LinearLayout()\r
- {\r
- LinearOrientation = LinearLayout.Orientation.Vertical,\r
- },\r
- WidthSpecification = LayoutParamPolicies.MatchParent,\r
- HeightSpecification = LayoutParamPolicies.WrapContent,\r
- };\r
-\r
- bool isWiFiOn = false;\r
- if (IsWiFiActive())\r
- {\r
- isWiFiOn = true;\r
- Log.Debug(Program.LogTag, "ScanAP");\r
- ScanAP();\r
- }\r
-\r
- var toggle = new DefaultLinearItem()\r
- {\r
- WidthSpecification = LayoutParamPolicies.MatchParent,\r
- Text = "Wi-Fi",\r
- IsSelectable = false,\r
- };\r
- toggle.Label.HorizontalAlignment = HorizontalAlignment.Begin;\r
-\r
- var onOffSwitch = new Switch()\r
- {\r
- IsSelected = isWiFiOn,\r
- };\r
-\r
- toggle.Extra = onOffSwitch;\r
- onOffSwitch.SelectedChanged += OnWiFiSelected;\r
- header.Add(toggle);\r
-\r
- return header;\r
- }\r
-\r
- private ContentPage CreateMainPage()\r
- {\r
- var moreButton = new Button()\r
- {\r
- Text = "More",\r
- };\r
-\r
- MenuItem[] menuItems = new MenuItem[itemCount];\r
- menuItems[0] = new MenuItem() { Text = "Add WiFi network" };\r
- menuItems[0].SelectedChanged += (object sender, SelectedChangedEventArgs args) =>\r
- {\r
- var menuItem = sender as MenuItem;\r
- navigator.Push(morePage);\r
- };\r
-\r
- moreButton.Clicked += (object sender, ClickedEventArgs args) =>\r
- {\r
- var menu = new Menu()\r
- {\r
- Anchor = moreButton,\r
- HorizontalPositionToAnchor = Menu.RelativePosition.Center,\r
- VerticalPositionToAnchor = Menu.RelativePosition.End,\r
- Items = menuItems,\r
- };\r
- menu.Post();\r
- };\r
-\r
- var appBar = new AppBar()\r
- {\r
- Title = "Wi-Fi",\r
- Actions = new View[] { moreButton, },\r
- };\r
-\r
- AppBarStyle appBarStyle = (AppBarStyle)ThemeManager.GetStyle("Tizen.NUI.Components.AppBar");\r
- Button backButton = new Button(((AppBarStyle)appBarStyle).BackButton);\r
-\r
- backButton.Clicked += (object source, ClickedEventArgs args) =>\r
- {\r
- navigator.Pop();\r
- };\r
-\r
- appBar.NavigationContent = backButton;\r
-\r
- View mainView = new View()\r
- {\r
- Layout = new LinearLayout()\r
- {\r
- LinearOrientation = LinearLayout.Orientation.Vertical,\r
- HorizontalAlignment = HorizontalAlignment.Center,\r
- },\r
- WidthSpecification = LayoutParamPolicies.MatchParent,\r
- HeightSpecification = LayoutParamPolicies.MatchParent,\r
- };\r
-\r
- scanList = new CollectionView()\r
- {\r
- ItemsSource = apSource,\r
- ItemsLayouter = new LinearLayouter(),\r
- ItemTemplate = new DataTemplate(() =>\r
- {\r
- DefaultLinearItem item = new DefaultLinearItem() //itemÀÌ °¢ AP\r
- {\r
- WidthSpecification = LayoutParamPolicies.MatchParent,\r
- };\r
- item.Label.SetBinding(TextLabel.TextProperty, "Essid");\r
- item.Label.HorizontalAlignment = HorizontalAlignment.Begin;\r
- item.SubLabel.SetBinding(TextLabel.TextProperty, "State");\r
- item.SubLabel.HorizontalAlignment = HorizontalAlignment.Begin;\r
- item.Icon.SetBinding(ImageView.ResourceUrlProperty, "ImageUrl");\r
- item.Icon.WidthSpecification = 40;\r
- item.Icon.HeightSpecification = 40;\r
-\r
- var infoButton = new Button()\r
- {\r
- Text = "i",\r
- WidthSpecification = 40,\r
- HeightSpecification = 40,\r
- };\r
- //infoButton.Icon.SetBinding(ImageView.ResourceUrlProperty, "InfoImageUrl");\r
- infoButton.Clicked += OnInfoButtonClicked;\r
- item.Extra = infoButton;\r
-\r
- return item;\r
- }),\r
- GroupHeaderTemplate = new DataTemplate(() =>\r
- {\r
- DefaultTitleItem group = new DefaultTitleItem();\r
- group.WidthSpecification = LayoutParamPolicies.MatchParent;\r
-\r
- group.Label.SetBinding(TextLabel.TextProperty, "Title");\r
- group.Label.HorizontalAlignment = HorizontalAlignment.Begin;\r
-\r
- return group;\r
- }),\r
- IsGrouped = true,\r
- ScrollingDirection = ScrollableBase.Direction.Vertical,\r
- WidthSpecification = LayoutParamPolicies.MatchParent,\r
- HeightSpecification = LayoutParamPolicies.MatchParent,\r
- SelectionMode = ItemSelectionMode.Single,\r
- };\r
- scanList.SelectionChanged += OnScanListSelected;\r
-\r
- var header = GetHeader();\r
- var scanButton = new Button()\r
- {\r
- Text = "Scan",\r
- WidthSpecification = 300,\r
- HeightSpecification = 80,\r
- };\r
- scanButton.Clicked += OnScanButtonClicked;\r
-\r
- mainView.Add(header);\r
- mainView.Add(scanList);\r
- mainView.Add(scanButton);\r
- ContentPage page = new ContentPage()\r
- {\r
- AppBar = appBar,\r
- Content = mainView,\r
- };\r
-\r
- return page;\r
- }\r
-\r
- private ContentPage CreateInfoPage(AP ap)\r
- {\r
- var appBar = new AppBar()\r
- {\r
- Title = "Wi-Fi network info",\r
- };\r
-\r
- AppBarStyle appBarStyle = (AppBarStyle)ThemeManager.GetStyle("Tizen.NUI.Components.AppBar");\r
- Button backButton = new Button(((AppBarStyle)appBarStyle).BackButton);\r
-\r
- backButton.Clicked += (object source, ClickedEventArgs args) =>\r
- {\r
- navigator.Pop();\r
- };\r
-\r
- View infoView = new View()\r
- {\r
- Layout = new LinearLayout()\r
- {\r
- LinearOrientation = LinearLayout.Orientation.Vertical,\r
- HorizontalAlignment = HorizontalAlignment.Center,\r
- },\r
- WidthSpecification = LayoutParamPolicies.MatchParent,\r
- HeightSpecification = LayoutParamPolicies.MatchParent,\r
- };\r
-\r
- var forgetButton = new Button()\r
- {\r
- Text = "Forget",\r
- WidthSpecification = 300,\r
- HeightSpecification = 80,\r
- };\r
-\r
- forgetButton.Clicked += (object source, ClickedEventArgs args) =>\r
- {\r
- Log.Debug(Program.LogTag, "Forget " + ap.Essid);\r
- wifi.Forget(ap.Essid);\r
- ScanAP();\r
- };\r
-\r
- infoView.Add(forgetButton);\r
- ContentPage page = new ContentPage()\r
- {\r
- AppBar = appBar,\r
- Content = infoView,\r
- };\r
-\r
- return page;\r
- }\r
-\r
- private ContentPage CreatemorePage()\r
- {\r
- var appBar = new AppBar()\r
- {\r
- Title = "Add Wi-Fi network",\r
- };\r
-\r
- AppBarStyle appBarStyle = (AppBarStyle)ThemeManager.GetStyle("Tizen.NUI.Components.AppBar");\r
- Button backButton = new Button(((AppBarStyle)appBarStyle).BackButton);\r
-\r
- backButton.Clicked += (object source, ClickedEventArgs args) =>\r
- {\r
- navigator.Pop();\r
- };\r
-\r
- View moreView = new View()\r
- {\r
- Layout = new LinearLayout()\r
- {\r
- LinearOrientation = LinearLayout.Orientation.Vertical,\r
- HorizontalAlignment = HorizontalAlignment.Center,\r
- },\r
- WidthSpecification = LayoutParamPolicies.MatchParent,\r
- HeightSpecification = LayoutParamPolicies.MatchParent,\r
- };\r
-\r
- ContentPage page = new ContentPage()\r
- {\r
- AppBar = appBar,\r
- Content = moreView,\r
- };\r
-\r
- return page;\r
- }\r
-\r
- protected override void OnCreate(string contentInfo, Window window)\r
- {\r
- navigator = window.GetDefaultNavigator();\r
- wifi = new WiFi();\r
- apSource = new APSource();\r
-\r
- mainPage = CreateMainPage();\r
- morePage = CreatemorePage();\r
-\r
- navigator.Push(mainPage);\r
- }\r
-\r
- /* Call WiFi */\r
- private async void OnWiFiSelected(object sender, SelectedChangedEventArgs e)\r
- {\r
- if (e.IsSelected)\r
- {\r
- if (!IsWiFiActive())\r
- {\r
- await wifi.Activate();\r
- }\r
- /* TODO: auto connect */\r
- ScanAP();\r
- }\r
- else\r
- {\r
- if (IsWiFiActive())\r
- {\r
- await wifi.Deactivate();\r
- }\r
- apSource.RemoveDevices();\r
- }\r
- }\r
-\r
- private void OnScanButtonClicked(object sender, ClickedEventArgs e)\r
- {\r
- Log.Debug(Program.LogTag, "OnScanButtonClicked");\r
- ScanAP();\r
- }\r
-\r
- private void OnInfoButtonClicked(object sender, ClickedEventArgs e)\r
- {\r
- Log.Debug(Program.LogTag, "OnInfoButtonClicked");\r
- Button button = (Button)sender;\r
- infoPage = CreateInfoPage(button.BindingContext as AP);\r
- navigator.Push(infoPage);\r
- }\r
-\r
- private bool IsWiFiActive()\r
- {\r
- return wifi.IsActive();\r
- }\r
-\r
- private async void ScanAP()\r
- {\r
- if (IsWiFiActive())\r
- {\r
- await wifi.Scan();\r
- List<AP> apList = wifi.GetScanResult();\r
- apSource.UpdateScanList(apList);\r
- }\r
- }\r
-\r
- public async void OnScanListSelected(object sender, SelectionChangedEventArgs ev)\r
- {\r
- //SingleSelection Only have 1 or nil object in the list.\r
- foreach (object item in ev.PreviousSelection)\r
- {\r
- if (item == null) break;\r
- if (item is AP ap)\r
- {\r
- //Log.Debug(LogTag, "Disconnect ");\r
- //await wifi.Disconnect(device.Essid);\r
- //device.State = "Disonnected";\r
-\r
- // device.Connected = false;\r
- }\r
- }\r
- foreach (object item in ev.CurrentSelection)\r
- {\r
- if (item == null) break;\r
- if (item is AP ap)\r
- {\r
- if (ap.State.Equals("Connected"))\r
- {\r
- Log.Debug(Program.LogTag, "already connected");\r
- return;\r
- }\r
-\r
- /* TODO: pop-up (password, cancel, connect) */\r
- ap.State = "Connecting";\r
- await wifi.Connect(ap.Essid, "datanetwork");\r
- if(wifi.GetConnectedAP().Equals(ap.Essid))\r
- {\r
- ap.State = "Connected";\r
- }\r
- // device.Connected = true;\r
- // device.Registered = true;\r
- }\r
- }\r
- }\r
- }\r
-}\r
--- /dev/null
+using System;\r
+using System.Collections.Generic;\r
+using System.Text;\r
+using System.Threading.Tasks;\r
+using Tizen;\r
+using Tizen.Network.WiFi;\r
+using static SettingWiFi.Logger;\r
+\r
+namespace SettingWiFi\r
+{\r
+ public class WiFi\r
+ {\r
+ IEnumerable<WiFiAP> apList = new List<WiFiAP>();\r
+\r
+ public async Task Activate()\r
+ {\r
+ Debug("WiFi.Activate");\r
+ try\r
+ {\r
+ await WiFiManager.ActivateAsync();\r
+ }\r
+ catch (Exception e)\r
+ {\r
+ Debug("Fail to activate WiFi " + e.ToString());\r
+ }\r
+ }\r
+\r
+ public Task Deactivate()\r
+ {\r
+ Debug("WiFi.Deactivate");\r
+ return WiFiManager.DeactivateAsync();\r
+ }\r
+\r
+ public async Task Scan()\r
+ {\r
+ Debug("WiFi.Scan");\r
+ try\r
+ {\r
+ await WiFiManager.ScanAsync();\r
+ }\r
+ catch (Exception e)\r
+ {\r
+ Debug("Fail to scan " + e.ToString());\r
+ }\r
+ }\r
+\r
+ public List<AP> GetScanResult()\r
+ {\r
+ Debug("WiFi.GetScanResult");\r
+ try\r
+ {\r
+ apList = WiFiManager.GetFoundAPs();\r
+ return GetAPList();\r
+ }\r
+ catch (Exception e)\r
+ {\r
+ Debug("Fail to get scan result " + e.ToString());\r
+ }\r
+\r
+ return null;\r
+ }\r
+\r
+ public async Task Connect(string essid, string password)\r
+ {\r
+ Debug("WiFi.Connect");\r
+ WiFiAP ap = FindAP(essid);\r
+ if (ap == null)\r
+ {\r
+ Debug("Cannet find " + essid);\r
+ return;\r
+ }\r
+\r
+ if (password.Length > 0)\r
+ {\r
+ ap.SecurityInformation.SetPassphrase(password);\r
+ }\r
+\r
+ try\r
+ {\r
+ await ap.ConnectAsync();\r
+ }\r
+ catch (Exception e)\r
+ {\r
+ Debug("Fail to connect" + e.ToString());\r
+ }\r
+\r
+ }\r
+\r
+ public Task Disconnect(string essid)\r
+ {\r
+ Debug("WiFi.Disconnect");\r
+ WiFiAP ap = FindAP(essid);\r
+ if (ap == null)\r
+ {\r
+ return Task.FromException(new ArgumentException("Cannot find " + essid));\r
+ }\r
+ return ap.DisconnectAsync();\r
+ }\r
+\r
+ public void Forget(string essid)\r
+ {\r
+ Debug("WiFi.Forget");\r
+ WiFiAP ap = FindAP(essid);\r
+ if (ap == null)\r
+ {\r
+ Debug("Cannot find " + essid);\r
+ return;\r
+ }\r
+ ap.ForgetAP();\r
+ }\r
+\r
+ private WiFiAP FindAP(string essid)\r
+ {\r
+ Debug("WiFi.FindAP");\r
+ GetScanResult();\r
+ foreach (var item in apList)\r
+ {\r
+ Debug("Found AP\t" + item.NetworkInformation.Essid);\r
+ if (item.NetworkInformation.Essid.Equals(essid))\r
+ {\r
+ return item;\r
+ }\r
+ }\r
+\r
+ return null;\r
+ }\r
+\r
+ public bool IsActive()\r
+ {\r
+ Debug("WiFi.IsActive");\r
+ if (WiFiManager.IsActive)\r
+ {\r
+ return true;\r
+ }\r
+\r
+ return false;\r
+ }\r
+\r
+ public string GetConnectedAP()\r
+ {\r
+ Debug("WiFi.GetConnectedAP");\r
+ return WiFiManager.GetConnectedAP().NetworkInformation.Essid;\r
+ }\r
+\r
+ public List<AP> GetAPList()\r
+ {\r
+ Debug("WiFi.GetAPList");\r
+ List<AP> apInfoList = new List<AP>();\r
+ foreach (var item in apList)\r
+ {\r
+ //Debug("AP name: " + item.NetworkInformation.Essid);\r
+ //Debug("AP connection state: " + item.NetworkInformation.ConnectionState.ToString());\r
+\r
+ string connectionState = item.NetworkInformation.ConnectionState.ToString();\r
+ string securityType = item.SecurityInformation.SecurityType.ToString();\r
+ //bool isPassphraseRequired = item.SecurityInformation.IsPassphraseRequired;\r
+ bool isWpsSupported = item.SecurityInformation.IsWpsSupported;\r
+\r
+ if (item.NetworkInformation.ConnectionState.ToString().Equals("Connected"))\r
+ {\r
+ apInfoList.Add(new AP(item.NetworkInformation.Essid, "Connected"));\r
+ continue;\r
+ }\r
+ string text = "";\r
+\r
+ if (securityType.Equals("None"))\r
+ {\r
+ text = "Open";\r
+ }\r
+ else if (securityType.Equals("Eap"))\r
+ {\r
+ text = "Secured (Eap)";\r
+ }\r
+ else if (isWpsSupported)\r
+ {\r
+ text = "Secured (WPS available)";\r
+ }\r
+ else\r
+ {\r
+ text = "Secured";\r
+ }\r
+\r
+ apInfoList.Add(new AP(item.NetworkInformation.Essid, text));\r
+ }\r
+\r
+ return apInfoList;\r
+ }\r
+ }\r
+}\r
--- /dev/null
+using System;\r
+using System.ComponentModel;\r
+using System.Collections.Generic;\r
+using System.Collections.ObjectModel;\r
+using Tizen;\r
+using Tizen.NUI.BaseComponents;\r
+using Tizen.NUI.Components;\r
+using Tizen.NUI.Binding;\r
+using Tizen.Network.WiFi;\r
+using static SettingWiFi.Logger;\r
+\r
+\r
+namespace SettingWiFi\r
+{\r
+ public class AP : INotifyPropertyChanged\r
+ {\r
+ string iconDir = Tizen.Applications.Application.Current.DirectoryInfo.Resource + "icon.png";\r
+ private string essid;\r
+ private string state;\r
+\r
+ public event PropertyChangedEventHandler PropertyChanged;\r
+\r
+ private void OnPropertyChanged(string propertyName)\r
+ {\r
+ Debug("OnPropertyChanged");\r
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));\r
+ }\r
+\r
+ public AP(string apEssid, string apState)\r
+ {\r
+ essid = apEssid;\r
+ state = apState;\r
+ }\r
+\r
+ public string Essid\r
+ {\r
+ get\r
+ {\r
+ return essid;\r
+ }\r
+ set\r
+ {\r
+ essid = value;\r
+ OnPropertyChanged("Essid");\r
+ }\r
+ }\r
+\r
+ public string ImageUrl\r
+ {\r
+ get\r
+ {\r
+ return iconDir;\r
+ }\r
+ }\r
+\r
+ public string State\r
+ {\r
+ get\r
+ {\r
+ return state;\r
+ }\r
+ set\r
+ {\r
+ state = value;\r
+ OnPropertyChanged("State");\r
+ }\r
+ }\r
+ };\r
+\r
+ public class DeviceCollection : ObservableCollection<AP>\r
+ {\r
+ private string title;\r
+\r
+ public DeviceCollection(string groupTitle)\r
+ {\r
+ title = groupTitle;\r
+ this.UpdateScanList(null);\r
+ }\r
+\r
+ public string Title\r
+ {\r
+ get\r
+ {\r
+ return title;\r
+ }\r
+ set\r
+ {\r
+ title = value;\r
+ OnPropertyChanged(new PropertyChangedEventArgs("Title"));\r
+ }\r
+ }\r
+\r
+ public void UpdateScanList(List<AP> apList)\r
+ {\r
+ if (apList == null)\r
+ {\r
+ Debug("apList is null");\r
+ this.Add(new AP("", ""));\r
+ return;\r
+ }\r
+ // Clear method have some issue about asynchronous actions,\r
+ // so call Remove for all item is recommanded.\r
+ while (this.Count > 0)\r
+ {\r
+ this.RemoveAt(this.Count - 1);\r
+ }\r
+\r
+ foreach (var item in apList)\r
+ {\r
+ this.Add(new AP(item.Essid, item.State));\r
+ }\r
+ }\r
+\r
+ public void RemoveDevices()\r
+ {\r
+ while (this.Count > 0)\r
+ {\r
+ this.RemoveAt(this.Count - 1);\r
+ }\r
+ }\r
+ }\r
+\r
+ public class APSource : ObservableCollection<DeviceCollection>\r
+ {\r
+ private DeviceCollection available;\r
+ public APSource()\r
+ {\r
+ Debug("new APSource");\r
+ available = new DeviceCollection("Available networks");\r
+ this.Add(available);\r
+ Debug("Add DeviceCollection");\r
+ }\r
+ public void UpdateScanList(List<AP> apList)\r
+ {\r
+ available.UpdateScanList(apList);\r
+ }\r
+\r
+ public void RemoveDevices()\r
+ {\r
+ available.RemoveDevices();\r
+ }\r
+ }\r
+}
\ No newline at end of file
--- /dev/null
+using Tizen;
+using Tizen.NUI;
+using Tizen.NUI.BaseComponents;
+using Tizen.NUI.Components;
+using static SettingWiFi.Logger;
+
+namespace SettingWiFi
+{
+ internal class InfoPage : ContentPage
+ {
+ private AP mAp;
+ private WiFi mWifi;
+
+ internal InfoPage(WiFi wifi)
+ {
+ mWifi = wifi;
+ }
+
+ internal void CreateComponents(AP ap)
+ {
+ mAp = ap;
+
+ var appBar = new AppBar()
+ {
+ Title = "Wi-Fi network info",
+ };
+
+ AppBarStyle appBarStyle = (AppBarStyle)ThemeManager.GetStyle("Tizen.NUI.Components.AppBar");
+ Button backButton = new Button(((AppBarStyle)appBarStyle).BackButton);
+
+ backButton.Clicked += OnBackButtonClicked;
+ View infoView = new View()
+ {
+ Layout = new LinearLayout()
+ {
+ LinearOrientation = LinearLayout.Orientation.Vertical,
+ HorizontalAlignment = HorizontalAlignment.Center,
+ },
+ WidthSpecification = LayoutParamPolicies.MatchParent,
+ HeightSpecification = LayoutParamPolicies.MatchParent,
+ };
+
+ var forgetButton = new Button()
+ {
+ Text = "Forget",
+ WidthSpecification = 300,
+ HeightSpecification = 80,
+ };
+
+ forgetButton.Clicked += OnForgetButtonClicked;
+
+ infoView.Add(forgetButton);
+
+ AppBar = appBar;
+ Content = infoView;
+ }
+
+ private void OnBackButtonClicked(object source, ClickedEventArgs args)
+ {
+ Navigator.Pop();
+ }
+
+ private void OnForgetButtonClicked(object source, ClickedEventArgs args)
+ {
+ Debug("Forget " + mAp.Essid);
+ mWifi.Forget(mAp.Essid);
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+using Tizen;
+
+namespace SettingWiFi
+{
+ internal class Logger
+ {
+ internal static readonly string LogTag = "SettingWiFi.App";
+
+ internal static void Debug(string msg)
+ {
+ Log.Debug(LogTag, msg);
+ }
+
+ internal static void Info(string msg)
+ {
+ Log.Info(LogTag, msg);
+ }
+
+ internal static void Error(string msg)
+ {
+ Log.Error(LogTag, msg);
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+using System.Collections.Generic;
+using Tizen;
+using Tizen.NUI;
+using Tizen.NUI.BaseComponents;
+using Tizen.NUI.Binding;
+using Tizen.NUI.Components;
+using static SettingWiFi.Logger;
+
+
+namespace SettingWiFi
+{
+ internal class MainPage : ContentPage
+ {
+ CollectionView mScanList;
+
+ ContentPage mInfoPage;
+ ContentPage mMorePage;
+
+ WiFi mWifi;
+ APSource mApSource;
+
+ private static readonly int itemCount = 1;
+ private MenuItem[] menuItems = new MenuItem[itemCount];
+
+ internal MainPage(WiFi wifi)
+ {
+ mWifi = wifi;
+ }
+
+ internal void CreateComponents()
+ {
+ mApSource = new APSource();
+
+ var moreButton = new Button()
+ {
+ Text = "More",
+ };
+
+ MenuItem[] menuItems = new MenuItem[itemCount];
+ menuItems[0] = new MenuItem() { Text = "Add WiFi network" };
+ menuItems[0].SelectedChanged += (object sender, SelectedChangedEventArgs args) =>
+ {
+ var menuItem = sender as MenuItem;
+ Navigator.Push(mMorePage);
+ };
+
+ moreButton.Clicked += (object sender, ClickedEventArgs args) =>
+ {
+ var menu = new Menu()
+ {
+ Anchor = moreButton,
+ HorizontalPositionToAnchor = Menu.RelativePosition.Center,
+ VerticalPositionToAnchor = Menu.RelativePosition.End,
+ Items = menuItems,
+ };
+ menu.Post();
+ };
+
+ var appBar = new AppBar()
+ {
+ Title = "Wi-Fi",
+ Actions = new View[] { moreButton, },
+ };
+
+ AppBarStyle appBarStyle = (AppBarStyle)ThemeManager.GetStyle("Tizen.NUI.Components.AppBar");
+ Button backButton = new Button(((AppBarStyle)appBarStyle).BackButton);
+
+ backButton.Clicked += (object source, ClickedEventArgs args) =>
+ {
+ Navigator.Pop();
+ };
+
+ appBar.NavigationContent = backButton;
+
+ View mainView = new View()
+ {
+ Layout = new LinearLayout()
+ {
+ LinearOrientation = LinearLayout.Orientation.Vertical,
+ HorizontalAlignment = HorizontalAlignment.Center,
+ },
+ WidthSpecification = LayoutParamPolicies.MatchParent,
+ HeightSpecification = LayoutParamPolicies.MatchParent,
+ };
+
+ mScanList = new CollectionView()
+ {
+ ItemsSource = mApSource,
+ ItemsLayouter = new LinearLayouter(),
+ ItemTemplate = CreateItemTemplate(),
+ GroupHeaderTemplate = new DataTemplate(() =>
+ {
+ DefaultTitleItem group = new DefaultTitleItem();
+ group.WidthSpecification = LayoutParamPolicies.MatchParent;
+
+ group.Label.SetBinding(TextLabel.TextProperty, "Title");
+ group.Label.HorizontalAlignment = HorizontalAlignment.Begin;
+
+ return group;
+ }),
+ IsGrouped = true,
+ ScrollingDirection = ScrollableBase.Direction.Vertical,
+ WidthSpecification = LayoutParamPolicies.MatchParent,
+ HeightSpecification = LayoutParamPolicies.MatchParent,
+ SelectionMode = ItemSelectionMode.Single,
+ };
+ mScanList.SelectionChanged += OnScanListSelected;
+
+ var header = GetHeader();
+ var scanButton = new Button()
+ {
+ Text = "Scan",
+ WidthSpecification = 300,
+ HeightSpecification = 80,
+ };
+ scanButton.Clicked += OnScanButtonClicked;
+
+ mainView.Add(header);
+ mainView.Add(mScanList);
+ mainView.Add(scanButton);
+
+ AppBar = appBar;
+ Content = mainView;
+ }
+
+ private DataTemplate CreateItemTemplate()
+ {
+ return new DataTemplate(() =>
+ {
+ DefaultLinearItem item = new DefaultLinearItem() //itemÀÌ °¢ AP
+ {
+ WidthSpecification = LayoutParamPolicies.MatchParent,
+ };
+ item.Label.SetBinding(TextLabel.TextProperty, "Essid");
+ item.Label.HorizontalAlignment = HorizontalAlignment.Begin;
+ item.SubLabel.SetBinding(TextLabel.TextProperty, "State");
+ item.SubLabel.HorizontalAlignment = HorizontalAlignment.Begin;
+ item.Icon.SetBinding(ImageView.ResourceUrlProperty, "ImageUrl");
+ item.Icon.WidthSpecification = 40;
+ item.Icon.HeightSpecification = 40;
+
+ var infoButton = new Button()
+ {
+ Text = "i",
+ WidthSpecification = 40,
+ HeightSpecification = 40,
+ };
+ //infoButton.Icon.SetBinding(ImageView.ResourceUrlProperty, "InfoImageUrl");
+ infoButton.Clicked += OnInfoButtonClicked;
+ item.Extra = infoButton;
+
+ return item;
+ });
+ }
+
+ private RecyclerViewItem GetHeader()
+ {
+ var header = new RecyclerViewItem()
+ {
+ Layout = new LinearLayout()
+ {
+ LinearOrientation = LinearLayout.Orientation.Vertical,
+ },
+ WidthSpecification = LayoutParamPolicies.MatchParent,
+ HeightSpecification = LayoutParamPolicies.WrapContent,
+ };
+
+ bool isWiFiOn = false;
+ if (IsWiFiActive())
+ {
+ isWiFiOn = true;
+ Debug("ScanAP");
+ ScanAP();
+ }
+
+ var toggle = new DefaultLinearItem()
+ {
+ WidthSpecification = LayoutParamPolicies.MatchParent,
+ Text = "Wi-Fi",
+ IsSelectable = false,
+ };
+ toggle.Label.HorizontalAlignment = HorizontalAlignment.Begin;
+
+ var onOffSwitch = new Switch()
+ {
+ IsSelected = isWiFiOn,
+ };
+
+ toggle.Extra = onOffSwitch;
+ onOffSwitch.SelectedChanged += OnWiFiSelected;
+ header.Add(toggle);
+
+ return header;
+ }
+
+ private ContentPage CreateInfoPage(AP ap)
+ {
+ var page = new InfoPage(mWifi);
+ page.CreateComponents(ap);
+ return page;
+ }
+
+ private ContentPage CreateMorePage()
+ {
+ var page = new MorePage(mWifi);
+ page.CreateComponents();
+ return page;
+ }
+
+ /* Call WiFi */
+ private async void OnWiFiSelected(object sender, SelectedChangedEventArgs e)
+ {
+ Debug("OnWiFiSelected");
+ if (e.IsSelected)
+ {
+ if (!IsWiFiActive())
+ {
+ await mWifi.Activate();
+ }
+ /* TODO: auto connect */
+ ScanAP();
+ }
+ else
+ {
+ if (IsWiFiActive())
+ {
+ await mWifi.Deactivate();
+ }
+ mApSource.RemoveDevices();
+ }
+ }
+
+ private void OnScanButtonClicked(object sender, ClickedEventArgs e)
+ {
+ Debug("OnScanButtonClicked");
+ ScanAP();
+ }
+
+ private void OnInfoButtonClicked(object sender, ClickedEventArgs e)
+ {
+ Debug("OnInfoButtonClicked");
+ Button button = (Button)sender;
+ mInfoPage = CreateInfoPage(button.BindingContext as AP);
+
+ Navigator.Push(mInfoPage);
+ }
+
+ private bool IsWiFiActive()
+ {
+ return mWifi.IsActive();
+ }
+
+ private async void ScanAP()
+ {
+ if (IsWiFiActive())
+ {
+ await mWifi.Scan();
+ List<AP> apList = mWifi.GetScanResult();
+ mApSource.UpdateScanList(apList);
+ }
+ }
+
+ public async void OnScanListSelected(object sender, SelectionChangedEventArgs ev)
+ {
+ //SingleSelection Only have 1 or nil object in the list.
+ foreach (object item in ev.PreviousSelection)
+ {
+ if (item == null) break;
+ if (item is AP ap)
+ {
+ //Log.Debug(LogTag, "Disconnect ");
+ //await wifi.Disconnect(device.Essid);
+ //device.State = "Disonnected";
+
+ // device.Connected = false;
+ }
+ }
+ foreach (object item in ev.CurrentSelection)
+ {
+ if (item == null) break;
+ if (item is AP ap)
+ {
+ if (ap.State.Equals("Connected"))
+ {
+ Debug("already connected");
+ return;
+ }
+
+ /* TODO: pop-up (password, cancel, connect) */
+ ap.State = "Connecting";
+ await mWifi.Connect(ap.Essid, "datanetwork");
+ if(mWifi.GetConnectedAP().Equals(ap.Essid))
+ {
+ ap.State = "Connected";
+ }
+ // device.Connected = true;
+ // device.Registered = true;
+ }
+ }
+ }
+ }
+}
--- /dev/null
+
+using Tizen.NUI;
+using Tizen.NUI.BaseComponents;
+using Tizen.NUI.Components;
+
+namespace SettingWiFi
+{
+ internal class MorePage : ContentPage
+ {
+ WiFi mWifi;
+
+ internal MorePage(WiFi wifi)
+ {
+ mWifi = wifi;
+ }
+
+ internal void CreateComponents()
+ {
+ var appBar = new AppBar()
+ {
+ Title = "Add Wi-Fi network",
+ };
+
+ AppBarStyle appBarStyle = (AppBarStyle)ThemeManager.GetStyle("Tizen.NUI.Components.AppBar");
+ Button backButton = new Button(((AppBarStyle)appBarStyle).BackButton);
+
+ backButton.Clicked += OnBackButtonClicked;
+
+ View moreView = new View()
+ {
+ Layout = new LinearLayout()
+ {
+ LinearOrientation = LinearLayout.Orientation.Vertical,
+ HorizontalAlignment = HorizontalAlignment.Center,
+ },
+ WidthSpecification = LayoutParamPolicies.MatchParent,
+ HeightSpecification = LayoutParamPolicies.MatchParent,
+ };
+
+ AppBar = appBar;
+ Content = moreView;
+ }
+
+ private void OnBackButtonClicked(object source, ClickedEventArgs args)
+ {
+ Navigator.Pop();
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+using System;\r
+using System.Collections.Generic;\r
+using Tizen;\r
+using Tizen.Applications;\r
+using Tizen.NUI;\r
+using Tizen.NUI.Accessibility;\r
+using Tizen.NUI.BaseComponents;\r
+using Tizen.NUI.Binding;\r
+using Tizen.NUI.Components;\r
+\r
+\r
+namespace SettingWiFi\r
+{\r
+ internal class WidgetSettingWiFi : Widget\r
+ {\r
+ Navigator navigator;\r
+\r
+ ContentPage mMainPage;\r
+\r
+ WiFi mWifi;\r
+\r
+ private ContentPage CreateMainPage()\r
+ {\r
+ var page = new MainPage(mWifi);\r
+ page.CreateComponents();\r
+ return page;\r
+ }\r
+\r
+ protected override void OnCreate(string contentInfo, Window window)\r
+ {\r
+ navigator = window.GetDefaultNavigator();\r
+ mWifi = new WiFi();\r
+\r
+ mMainPage = CreateMainPage();\r
+ navigator.Push(mMainPage);\r
+ }\r
+ }\r
+}\r