Handle disconnection of wfd peer 76/317476/3 accepted/tizen/unified/20250113.133501 accepted/tizen/unified/x/20250310.113937
authorAkash Kumar <akash1.kumar@samsung.com>
Thu, 2 Jan 2025 10:39:58 +0000 (16:09 +0530)
committerAkash Kumar <akash1.kumar@samsung.com>
Thu, 2 Jan 2025 11:17:45 +0000 (16:47 +0530)
This patch:
- Implements disconnection functionality of wfd peer
- Update peer list after disconnection
- Updates the logic to call startdiscovery

Change-Id: I7038dbe88acc756fbd531abd115bbdfe7559fc24
Signed-off-by: Akash Kumar <akash1.kumar@samsung.com>
SettingWiFiDirect/SettingWiFiDirect/SettingWiFiDirect.cs
SettingWiFiDirect/SettingWiFiDirect/TextResources/Resources.Designer.cs
SettingWiFiDirect/SettingWiFiDirect/TextResources/Resources.en-US.resx
SettingWiFiDirect/SettingWiFiDirect/TextResources/Resources.ko-KR.resx
SettingWiFiDirect/SettingWiFiDirect/TextResources/Resources.resx
SettingWiFiDirect/SettingWiFiDirect/controller/WiFiDirect.cs
SettingWiFiDirect/SettingWiFiDirect/model/Peer.cs
SettingWiFiDirect/SettingWiFiDirect/view/WiFiDirectDeviceView.cs
packaging/org.tizen.cssetting-wifi-direct-1.0.3.rpk

index ed8045391c2920f16e15f860e54e11e93f6348ab..63022a80a65e5e743067d78535a6b925371a7525 100644 (file)
@@ -18,6 +18,7 @@ namespace SettingWiFiDirect
         private WiFiDirect mWifiDirect;
         private PeerSource mPeerSource;
         private CollectionView mScanList;
+        bool mNeedScanning;
         public override string ProvideTitle() => NUIGadgetResourceManager.GetString(nameof(Resources.IDS_WIFI_BODY_WI_FI_DIRECT_ABB));
 
         protected override void OnCustomizationUpdate(IEnumerable<MenuCustomizationItem> items)
@@ -30,6 +31,8 @@ namespace SettingWiFiDirect
         {
             Debug("+");
             mWifiDirect = new WiFiDirect();
+            mNeedScanning = true;
+            mWifiDirect.WFDStateChanged += OnWFDStateChanged;
             mWifiDirect.Activate();
             try
             {
@@ -59,7 +62,7 @@ namespace SettingWiFiDirect
             base.OnCreate();
             ResourceManager.TextResourceManager = this;
             mPeerSource = new PeerSource();
-            mPeerSource.SetScanningState(true);
+            ChangeScanningState(true);
             return CreateComponents();
         }
 
@@ -129,7 +132,6 @@ namespace SettingWiFiDirect
                 HeightSpecification = LayoutParamPolicies.MatchParent,
                 SelectionMode = ItemSelectionMode.Single,
             };
-            mWifiDirect.WFDStateChanged += OnWFDStateChanged;
 
             mScanList.Relayout += (s, e) =>
             {
@@ -150,19 +152,37 @@ namespace SettingWiFiDirect
             switch (e.State)
             {
                 case WFDState.Discovering:
-                    mPeerSource.SetScanningState(true);
+                    ChangeScanningState(true);
                     break;
                 case WFDState.Activated:
-                    UpdateDeviceList();
-                    mPeerSource.SetScanningState(false);
+                    if (mNeedScanning)
+                    {
+                        StartScan();
+                    }else
+                    {
+                        UpdateDeviceList();
+                        ChangeScanningState(false);
+                    }
                     break;
                 case WFDState.Connected:
                     ShowConnectedDevice();
                     break;
+                case WFDState.Disconnecting:
+                    mNeedScanning = true;
+                    break;
                 //TODO: update for further states.
             }
         }
 
+        private void ChangeScanningState(bool isScanning)
+        {
+            if(mPeerSource != null)
+            {
+                Debug("+");
+                mPeerSource.SetScanningState(isScanning);
+            }
+        }
+
         private Selector<Color> GetDefaultColorSelector()
         {
             return new Selector<Color>()
@@ -215,7 +235,14 @@ namespace SettingWiFiDirect
         private void StartScan()
         {
             Debug("+");
-            mWifiDirect.StartDiscovery();
+
+            bool discoveryStarted = mWifiDirect.StartDiscovery();
+            if (discoveryStarted)
+            {
+                Debug("Discovery started");
+                mNeedScanning = false;
+                ChangeScanningState(true);
+            }
             Debug("-");
         }
 
@@ -225,7 +252,7 @@ namespace SettingWiFiDirect
             try
             {
                 List<Peer> peerList = mWifiDirect.GetScanResult();
-                mPeerSource.AddFoundPeers(peerList);
+                mPeerSource.ShowDiscoveredPeers(peerList);
             }
             catch (Exception e)
             {
index 34a7637ad9117df8f8cb8a07d13b2e7377a41b8f..a2ff4944a2c6a9607a84246dd15a6f3f96f7b261 100644 (file)
@@ -117,6 +117,24 @@ namespace SettingWiFiDirect.TextResources {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Disconnecting....
+        /// </summary>
+        public static string IDS_WIFI_BODY_DISCONNECTING {
+            get {
+                return ResourceManager.GetString("IDS_WIFI_BODY_DISCONNECTING", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Unknown.
+        /// </summary>
+        public static string IDS_WIFI_BODY_UNKNOWN {
+            get {
+                return ResourceManager.GetString("IDS_WIFI_BODY_UNKNOWN", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Wi-Fi Direct.
         /// </summary>
index 1ba258e116c2bcc68b92177465b726166730834f..b61b83d5218fb5812916ea95644fe008eaac9dd8 100644 (file)
   <data name="IDS_WIFI_BODY_CONNECTING_ING" xml:space="preserve">
     <value>Connecting...</value>
   </data>
+  <data name="IDS_WIFI_BODY_DISCONNECTING" xml:space="preserve">
+    <value>Disconnecting...</value>
+  </data>
+  <data name="IDS_WIFI_BODY_UNKNOWN" xml:space="preserve">
+    <value>Unknown</value>
+  </data>
   <data name="IDS_WIFI_BODY_WI_FI_DIRECT_ABB" xml:space="preserve">
     <value>Wi-Fi Direct</value>
   </data>
index a9f38fe349345c2403e786cf132ac9f698d939a4..100a8c645573a016fe15ecc8b8f3afa33f17d037 100644 (file)
   <data name="IDS_WIFI_BODY_CONNECTING_ING" xml:space="preserve">
     <value>연결 중...</value>
   </data>
+  <data name="IDS_WIFI_BODY_DISCONNECTING" xml:space="preserve">
+    <value>디스커넥팅...</value>
+  </data>
+  <data name="IDS_WIFI_BODY_UNKNOWN" xml:space="preserve">
+    <value>미상</value>
+  </data>
   <data name="IDS_WIFI_BODY_WI_FI_DIRECT_ABB" xml:space="preserve">
     <value>Wi-Fi 다이렉트</value>
   </data>
index 1ba258e116c2bcc68b92177465b726166730834f..b61b83d5218fb5812916ea95644fe008eaac9dd8 100644 (file)
   <data name="IDS_WIFI_BODY_CONNECTING_ING" xml:space="preserve">
     <value>Connecting...</value>
   </data>
+  <data name="IDS_WIFI_BODY_DISCONNECTING" xml:space="preserve">
+    <value>Disconnecting...</value>
+  </data>
+  <data name="IDS_WIFI_BODY_UNKNOWN" xml:space="preserve">
+    <value>Unknown</value>
+  </data>
   <data name="IDS_WIFI_BODY_WI_FI_DIRECT_ABB" xml:space="preserve">
     <value>Wi-Fi Direct</value>
   </data>
index dc7878d21bbdf14ac36c27f997c9664face457f3..63b51468cd77b9845496518b90072f4af769b457 100644 (file)
@@ -34,6 +34,10 @@ namespace SettingWiFiDirect
 
         public async Task Activate()
         {
+            WiFiDirectManager.DeviceStateChanged += (Object sender, DeviceStateChangedEventArgs e) =>
+            {
+                Debug("DeviceState: " + e.DeviceState);
+            };
 
             Debug("WiFiDirect.Activate");
             Initialize();
@@ -44,7 +48,6 @@ namespace SettingWiFiDirect
             try
             {
                 WiFiDirectManager.Activate();
-                StartDiscovery();
             }
             catch (Exception e)
             {
@@ -110,7 +113,7 @@ namespace SettingWiFiDirect
             }
         }
 
-        public void StartDiscovery()
+        public bool StartDiscovery()
         {
             Debug("+");
             try
@@ -120,7 +123,9 @@ namespace SettingWiFiDirect
             catch (Exception e)
             {
                 Error("Error: " + e.Message + "\n" + e.StackTrace);
+                return false;
             }
+            return true;
         }
 
         public bool IsDiscoverable()
index 78b2640964f01f903c5cffdb5102d3dcf586eb4b..97c256f93be873f46206d408e3c182f71842b51c 100644 (file)
@@ -2,16 +2,26 @@ using System;
 using System.ComponentModel;
 using Tizen.Network.WiFiDirect;
 using static SettingWiFiDirect.Logger;
+using SettingWiFiDirect.TextResources;
 
 namespace SettingWiFiDirect
 {
+    public enum PeerState
+    {
+        Unknown = -1,
+        Connecting = 0,
+        Connected,
+        Disconnecting,
+        Disconnected
+    }
+
     public class Peer : INotifyPropertyChanged
     {
         private WiFiDirectPeer mWfdPeer;
         private string mPeerName;
         private string mAddress;
         private int mRssi = 0;
-        private WiFiDirectConnectionState mState;
+        private PeerState mState;
         private string mStateInfo;
         public event PropertyChangedEventHandler PropertyChanged;
 
@@ -21,10 +31,17 @@ namespace SettingWiFiDirect
             Name = peer.Name;
             Address = peer.MacAddress;
             mRssi = peer.Rssi;
-            mStateInfo = GetStateInfo();
+            Debug("isConnected: " +  mWfdPeer.IsConnected);
+            State = mWfdPeer.IsConnected ? PeerState.Connected : PeerState.Disconnected;
             mWfdPeer.ConnectionStateChanged += ConnectionStateChanged;
         }
 
+        ~Peer()
+        {
+            Debug("+");
+            mWfdPeer.ConnectionStateChanged -= ConnectionStateChanged;
+        }
+
         private void ConnectionStateChanged(object sender, ConnectionStateChangedEventArgs e)
         {
             Debug(this.GetHashCode() + " State: " + e.State + " Address: " + e.MacAddress);
@@ -34,20 +51,16 @@ namespace SettingWiFiDirect
                 switch (e.State)
                 {
                     case WiFiDirectConnectionState.ConnectionRsp:
-                        Debug("Update stateInfo");
-                        StateInfo = "Connected";
+                        State = PeerState.Connected;
                         break;
                     case WiFiDirectConnectionState.ConnectionWpsRequest:
                         break;
                     case WiFiDirectConnectionState.DisconnectRsp:
-                        Debug("Update stateInfo");
-                        StateInfo = "Available";
+                        State = PeerState.Disconnected;
                         break;
                     case WiFiDirectConnectionState.DisconnectInd:
-                        Debug("Update stateInfo");
-                        StateInfo = "Available";
+                        State = PeerState.Disconnected;
                         break;
-
                 }
             }
             Debug("StateInfo " + StateInfo);
@@ -93,7 +106,7 @@ namespace SettingWiFiDirect
             }
         }
 
-        public WiFiDirectConnectionState State
+        public PeerState State
         {
             get
             {
@@ -119,28 +132,20 @@ namespace SettingWiFiDirect
             }
         }
 
-        private string GetStateInfo(WiFiDirectConnectionState state)
-        {
-            //TODO: update
-            if (mWfdPeer.IsConnected)
-            {
-                return "Connected";
-            }else
-            {
-                return "Available";
-            }
-        }
-
-        private string GetStateInfo()
+        private string GetStateInfo(PeerState state)
         {
-            //TODO: update
-            if (mWfdPeer.IsConnected)
-            {
-                return "Connected";
-            }
-            else
-            {
-                return "Available";
+            switch (state)
+            {
+                case PeerState.Connecting:
+                    return ResourceManager.TextResourceManager.NUIGadgetResourceManager.GetString(nameof(Resources.IDS_WIFI_BODY_CONNECTING_ING));
+                case PeerState.Connected:
+                    return ResourceManager.TextResourceManager.NUIGadgetResourceManager.GetString(nameof(Resources.IDS_COM_BODY_CONNECTED_M_STATUS));
+                case PeerState.Disconnecting:
+                    return ResourceManager.TextResourceManager.NUIGadgetResourceManager.GetString(nameof(Resources.IDS_WIFI_BODY_DISCONNECTING));
+                case PeerState.Disconnected:
+                    return ResourceManager.TextResourceManager.NUIGadgetResourceManager.GetString(nameof(Resources.IDS_CHATON_BODY_AVAILABLE));
+                default:
+                    return ResourceManager.TextResourceManager.NUIGadgetResourceManager.GetString(nameof(Resources.IDS_WIFI_BODY_UNKNOWN));
             }
         }
 
@@ -175,10 +180,10 @@ namespace SettingWiFiDirect
             }
         }
 
-        public bool IsConnected() 
+        public bool IsConnected()
         {
             Debug ("Connected?: " + mWfdPeer.IsConnected);
-            return mWfdPeer.IsConnected;
+            return mState == PeerState.Connected;
         }
     }
 }
index 8992342fb9bc3a548860993b6de0a9cb9c910a5e..2761e55d2202cc979c705d0e5a05195edda0e5eb 100644 (file)
@@ -73,78 +73,66 @@ namespace SettingWiFiDirect
 
     public class PeerSource : ObservableCollection<DeviceCollection>
     {
-        private DeviceCollection mAvailable;
-        private DeviceCollection mConnected;
+        private DeviceCollection mPeerCollection;
+        string mAvailableGroupTitle, mConnectedGroupTitle;
 
         public PeerSource()
         {
             Debug("+");
 
-            var availableGroupTitle = ResourceManager.TextResourceManager.NUIGadgetResourceManager.GetString(
+            mAvailableGroupTitle = ResourceManager.TextResourceManager.NUIGadgetResourceManager.GetString(
                 nameof(Resources.IDS_WIFI_HEADER_AVAILABLE_DEVICES_ABB));
+            mConnectedGroupTitle = ResourceManager.TextResourceManager.NUIGadgetResourceManager.GetString(
+                nameof(Resources.IDS_ST_HEADER_CONNECTED_DEVICES));
+
+            mPeerCollection = new DeviceCollection(mAvailableGroupTitle);
+            this.Add(mPeerCollection);
 
-            mAvailable = new DeviceCollection(availableGroupTitle);
-            this.Add(mAvailable);
         }
 
         internal void AddToAvailableDeviceList(Peer peer)
         {
-            mAvailable.AddDevice(peer);
+            mPeerCollection.AddDevice(peer);
         }
 
-        internal void AddFoundPeers(List<Peer> peerList)
+        internal void ShowDiscoveredPeers(List<Peer> peerList)
         {
             Debug("Size: " + peerList.Count);
-            mAvailable.Clear();
+            mPeerCollection.Clear();
+            mPeerCollection.Title = mAvailableGroupTitle;
             foreach (var item in peerList)
             {
-                mAvailable.AddDevice(item);
+                mPeerCollection.AddDevice(item);
             }
         }
 
         public void SetScanningState(bool isScanning)
         {
-            mAvailable.IconOpacity = isScanning ? 1.0f : 0.0f;
+            mPeerCollection.IconOpacity = isScanning ? 1.0f : 0.0f;
         }
 
         public void ShowConnectedPeer(List<Peer> peerList)
         {
-            Debug("+");
-
-            string groupTitle = ResourceManager.TextResourceManager.NUIGadgetResourceManager.GetString(
-                nameof(Resources.IDS_ST_HEADER_CONNECTED_DEVICES));
+            Debug("Size:" + peerList.Count);
 
-            try
-            {
-                mConnected = new DeviceCollection(groupTitle);
-                Debug("Count: " + this.Count);
-                this.Clear();
-                Debug("Count: " + this.Count);
-                this.Add(mConnected);
-                Debug("Count: " + this.Count);
-            }
-            catch (Exception e)
-            {
-                Error(e.Message + "\n" + e.StackTrace);
-            }
-            Debug("Size: " + peerList.Count);
-            mConnected.Clear();
+            mPeerCollection.Clear();
+            mPeerCollection.Title = mConnectedGroupTitle;
             foreach (var item in peerList)
             {
-                mConnected.AddDevice(item);
+                mPeerCollection.AddDevice(item);
             }
         }
 
         private void AddConnectedDevice()
         {
             Debug("+");
-            foreach (Peer peer in mAvailable)
+            foreach (Peer peer in mPeerCollection)
             {
                 Debug(peer.Name + " : " + peer.Address);
                 if (peer.IsConnected())
                 {
                     Debug("+" + peer.Name + "Connected.");
-                    mConnected.AddDevice(peer);
+                    mPeerCollection.AddDevice(peer);
                 }
             }
         }
index 05e5da77ae43e6c27369b541921b0b0b14bac71a..61482cf65699044f1a03d4d0202614d981d3c5dc 100644 (file)
Binary files a/packaging/org.tizen.cssetting-wifi-direct-1.0.3.rpk and b/packaging/org.tizen.cssetting-wifi-direct-1.0.3.rpk differ