From 6992b9bc927550ed3ec82eff8ec4a5aa65e6fa63 Mon Sep 17 00:00:00 2001
From: JLChen <551775569@qq.com>
Date: 星期一, 12 四月 2021 17:39:14 +0800
Subject: [PATCH] 2021-04-12 1.完善智能音箱功能。

---
 HDL-ON_Android/Assets/Language.ini                                                |    2 
 HDL_ON/HDL_ON.projitems                                                           |    3 
 HDL_ON/UI/UI2/4-PersonalCenter/SmartSpeaker/SmartSpeakerSelectDevicesPage (副本).cs |  422 ++++++++++++++++++
 HDL-ON_iOS/Resources/Language.ini                                                 |    2 
 HDL_ON/DAL/Server/NewAPI.cs                                                       |    4 
 HDL_ON/UI/UI2/4-PersonalCenter/SmartSpeaker/SmartSpeakerRoomListPage.cs           |  309 +++++++++++++
 HDL_ON/DAL/Server/NewApiRes.cs                                                    |   27 
 HDL_ON/UI/UI0-Public/PublicAssmebly.cs                                            |    9 
 HDL_ON/UI/UI2/4-PersonalCenter/SmartSpeaker/SmartSpeakerSelectDevicesPage.cs      |  437 +++++++++++++++++++
 HDL_ON/UI/UI2/4-PersonalCenter/PersonalCenterPage.cs                              |    1 
 HDL_ON/Common/R.cs                                                                |    5 
 HDL_ON/DAL/Server/HttpServerRequest.cs                                            |   12 
 .vs/HDL_APP_Project/xs/UserPrefs.xml                                              |   21 
 HDL_ON/UI/UI2/4-PersonalCenter/SmartSpeaker/SmartSpeakerListPage.cs               |  117 ++++-
 14 files changed, 1,330 insertions(+), 41 deletions(-)

diff --git a/.vs/HDL_APP_Project/xs/UserPrefs.xml b/.vs/HDL_APP_Project/xs/UserPrefs.xml
index 21f286a..c5a8a47 100644
--- a/.vs/HDL_APP_Project/xs/UserPrefs.xml
+++ b/.vs/HDL_APP_Project/xs/UserPrefs.xml
@@ -1,29 +1,32 @@
 锘�<Properties StartupConfiguration="{D998E133-F0DD-4760-BE3C-461632F54DA4}|Default">
   <MonoDevelop.Ide.ItemProperties.HDL-ON__iOS PreferredExecutionTarget="MonoDevelop.IPhone.IPhoneDeviceTarget.00008030-00014C392121802E" />
-  <MonoDevelop.Ide.Workbench ActiveDocument="HDL_ON/UI/UI2/4-PersonalCenter/PersonalCenterPageBLL.cs">
+  <MonoDevelop.Ide.Workbench ActiveDocument="HDL_ON/UI/BindingResidence/BindingResidencePage.cs">
     <Files>
-      <File FileName="HDL_ON/UI/UI2/4-PersonalCenter/SmartSpeaker/SmartSpeakerListPage.cs" Line="194" Column="15" />
-      <File FileName="HDL_ON/UI/UI2/4-PersonalCenter/PersonalCenterPage.cs" Line="1" Column="1" />
-      <File FileName="HDL_ON/UI/UI2/4-PersonalCenter/PersonalCenterPageBLL.cs" Line="315" Column="17" />
+      <File FileName="HDL_ON/UI/UI2/4-PersonalCenter/SmartSpeaker/SmartSpeakerSelectDevicesPage.cs" Line="84" Column="51" />
+      <File FileName="HDL_ON/DAL/Server/HttpServerRequest.cs" />
+      <File FileName="HDL_ON/UI/UI2/4-PersonalCenter/PersonalCenterPageBLL.cs" />
+      <File FileName="HDL_ON/UI/UI2/4-PersonalCenter/PersonalCenterPage.cs" />
+      <File FileName="HDL_ON/UI/BindingResidence/BindingResidencePage.cs" Line="121" Column="42" />
+      <File FileName="HDL_ON/UI/BindingResidence/WellcomToHomeForm.cs" />
     </Files>
     <Pads>
       <Pad Id="ProjectPad">
         <State name="__root__">
           <Node name="HDL_APP_Project" expanded="True">
             <Node name="HDL_ON" expanded="True">
-              <Node name="Common" expanded="True" />
               <Node name="DAL" expanded="True">
                 <Node name="Server" expanded="True" />
               </Node>
               <Node name="UI" expanded="True">
+                <Node name="BindingResidence" expanded="True">
+                  <Node name="BindingResidencePage.cs" selected="True" />
+                </Node>
                 <Node name="UI2" expanded="True">
-                  <Node name="4-PersonalCenter" expanded="True">
-                    <Node name="SmartSpeaker" expanded="True" />
-                    <Node name="PersonalCenterPageBLL.cs" selected="True" />
-                  </Node>
+                  <Node name="4-PersonalCenter" expanded="True" />
                 </Node>
               </Node>
             </Node>
+            <Node name="HDL-ON_Android" expanded="True" />
           </Node>
         </State>
       </Pad>
diff --git a/HDL-ON_Android/Assets/Language.ini b/HDL-ON_Android/Assets/Language.ini
index cd221c8..a86efe6 100644
--- a/HDL-ON_Android/Assets/Language.ini
+++ b/HDL-ON_Android/Assets/Language.ini
@@ -741,6 +741,7 @@
 9065=Data management
 9066=Remarks
 9067=Remarks cannot be blank.
+9068=Do you want to unbind?
 	
 10000=Invalid password, please log in again.
 10001=Fail to request server, please try again later.
@@ -1630,6 +1631,7 @@
 9065=鏁版嵁绠$悊
 9066=澶囨敞
 9067=澶囨敞涓嶈兘涓虹┖
+9068=鏄惁瑙i櫎缁戝畾锛�
 
 10000=鏃犳晥鐧诲綍瀵嗛挜锛岃閲嶆柊鐧诲綍锛�
 10001=璇锋眰鏈嶅姟鍣ㄥけ璐ワ紝璇风◢鍚庡啀璇曪紒
diff --git a/HDL-ON_iOS/Resources/Language.ini b/HDL-ON_iOS/Resources/Language.ini
index cd221c8..a86efe6 100644
--- a/HDL-ON_iOS/Resources/Language.ini
+++ b/HDL-ON_iOS/Resources/Language.ini
@@ -741,6 +741,7 @@
 9065=Data management
 9066=Remarks
 9067=Remarks cannot be blank.
+9068=Do you want to unbind?
 	
 10000=Invalid password, please log in again.
 10001=Fail to request server, please try again later.
@@ -1630,6 +1631,7 @@
 9065=鏁版嵁绠$悊
 9066=澶囨敞
 9067=澶囨敞涓嶈兘涓虹┖
+9068=鏄惁瑙i櫎缁戝畾锛�
 
 10000=鏃犳晥鐧诲綍瀵嗛挜锛岃閲嶆柊鐧诲綍锛�
 10001=璇锋眰鏈嶅姟鍣ㄥけ璐ワ紝璇风◢鍚庡啀璇曪紒
diff --git a/HDL_ON/Common/R.cs b/HDL_ON/Common/R.cs
index 5c4ed77..0f45347 100644
--- a/HDL_ON/Common/R.cs
+++ b/HDL_ON/Common/R.cs
@@ -1329,7 +1329,10 @@
         /// 澶囨敞涓嶈兘涓虹┖
         /// </summary>
         public const int RemarksCannotBeBlank = 9067;
-
+        /// <summary>
+        /// 鏄惁瑙i櫎缁戝畾锛�
+        /// </summary>
+        public const int DoYouWantToUnbind = 9068;
 
 
 
diff --git a/HDL_ON/DAL/Server/HttpServerRequest.cs b/HDL_ON/DAL/Server/HttpServerRequest.cs
index b23c8ad..837ee79 100644
--- a/HDL_ON/DAL/Server/HttpServerRequest.cs
+++ b/HDL_ON/DAL/Server/HttpServerRequest.cs
@@ -2274,6 +2274,18 @@
         }
 
         /// <summary>
+        /// 瑙i櫎闊崇缁戝畾
+        /// </summary>
+        /// <returns></returns>
+        public ResponsePackNew UnbindSpeaker(string tokenId)
+        {
+            Dictionary<string, object> d = new Dictionary<string, object>();
+            d.Add("tokenId", tokenId);
+            var requestJson = HttpUtil.GetSignRequestJson(d);
+            return HttpUtil.RequestHttpsPostFroHome(NewAPI.API_POST_Speaker_Unbind, requestJson);
+        }
+
+        /// <summary>
         /// 鑾峰彇闊崇鍒嗛厤鐨勮澶囧拰鍦烘櫙鍒楄〃
         /// </summary>
         /// <param name="getType">0 鏄煡璇㈠叏閮� 1鏄煡璇㈣澶� 2鏄煡璇㈠満鏅�</param>
diff --git a/HDL_ON/DAL/Server/NewAPI.cs b/HDL_ON/DAL/Server/NewAPI.cs
index fbce795..dcbc5df 100644
--- a/HDL_ON/DAL/Server/NewAPI.cs
+++ b/HDL_ON/DAL/Server/NewAPI.cs
@@ -245,6 +245,10 @@
         /// </summary>
         public const string API_POST_Speaker_Remark_Update = "/smart-footstone/app/token/update";
         /// <summary>
+        /// 瑙g粦闊崇
+        /// </summary>
+        public const string API_POST_Speaker_Unbind = "/smart-footstone/app/token/delete";
+        /// <summary>
         /// 鑾峰彇闊崇鍒嗛厤鐨勮澶囧拰鍦烘櫙鍒楄〃
         /// </summary>
         public const string API_POST_Speaker_DeviceList_Get = "/home-wisdom/app/tokenRelation/list";
diff --git a/HDL_ON/DAL/Server/NewApiRes.cs b/HDL_ON/DAL/Server/NewApiRes.cs
index 21f66ff..0418fa7 100644
--- a/HDL_ON/DAL/Server/NewApiRes.cs
+++ b/HDL_ON/DAL/Server/NewApiRes.cs
@@ -1546,10 +1546,10 @@
     }
 
     /// <summary>
-    /// 
+    /// 閰嶇疆鐨勮闊宠澶囧拰鍦烘櫙鏁版嵁
     /// </summary>
     [System.Serializable]
-    public class TargetInfo
+    public class SpeakerTargetInfo
     {
         /// <summary>
         /// 鎺у埗鐨勭洰鏍嘔d锛屼簯绔殑璁惧Id鎴栬�呭満鏅疘d
@@ -1563,19 +1563,32 @@
         /// 鐩爣鍚嶇О
         /// </summary>
         public string targetName;
+        /// <summary>
+        /// 鎵╁睍鍙傛暟褰撳墠rowview鏄惁閫変腑
+        /// </summary>
+        public bool IsSelect;
     }
 
+    //[System.Serializable]
+    //public class SpeakerTargetInfoRow: SpeakerTargetInfo
+    //{
+    //    /// <summary>
+    //    /// 褰撳墠rowview鏄惁閫変腑
+    //    /// </summary>
+    //    public bool isSelect;
+    //}
 
-    /// <summary>
-    /// 鏇存柊闊崇鎺у埗鐨勮澶囧拰鍦烘櫙鐩爣
-    /// </summary>
-    [System.Serializable]
+
+        /// <summary>
+        /// 鏇存柊闊崇鎺у埗鐨勮澶囧拰鍦烘櫙鐩爣
+        /// </summary>
+        [System.Serializable]
     public class UpdateSpeakerDeviceListObj : SpeakerObj
     {
         /// <summary>
         /// 澶囨敞
         /// </summary>
-        public List<TargetInfo> targetInfos;
+        public List<SpeakerTargetInfo> targetInfos;
     }
 
     /// <summary>
diff --git a/HDL_ON/HDL_ON.projitems b/HDL_ON/HDL_ON.projitems
index 4406018..080bd88 100644
--- a/HDL_ON/HDL_ON.projitems
+++ b/HDL_ON/HDL_ON.projitems
@@ -396,6 +396,9 @@
     <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\FuntionControlView\Video\VideoMainView.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\FuntionControlView\Video\ObjectClass.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\4-PersonalCenter\SmartSpeaker\SmartSpeakerListPage.cs" />
+    <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\4-PersonalCenter\SmartSpeaker\SmartSpeakerSelectDevicesPage.cs" />
+    <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\4-PersonalCenter\SmartSpeaker\SmartSpeakerRoomListPage.cs" />
+    <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\4-PersonalCenter\SmartSpeaker\SmartSpeakerSelectDevicesPage %28鍓湰%29.cs" />
   </ItemGroup>
   <ItemGroup>
     <Folder Include="$(MSBuildThisFileDirectory)DAL\" />
diff --git a/HDL_ON/UI/UI0-Public/PublicAssmebly.cs b/HDL_ON/UI/UI0-Public/PublicAssmebly.cs
index e81f6c7..c688774 100644
--- a/HDL_ON/UI/UI0-Public/PublicAssmebly.cs
+++ b/HDL_ON/UI/UI0-Public/PublicAssmebly.cs
@@ -77,7 +77,7 @@
         /// 淇濆瓨鎸夐挳浜嬩欢闇�瑕佸皢
         /// </summary>
         /// <param name="callBackAction">鍥炶皟鍑芥暟</param>
-        public void LoadDialog_EditParater(int titleId, string editParater, Action<string> callBackAction, int errorId_IsNullOrEmpty, int errorId_ContainsPar, List<string> baseList, bool encryption = false)
+        public void LoadDialog_EditParater(int titleId, string editParater, Action<string> callBackAction, int errorId_IsNullOrEmpty, int errorId_ContainsPar, List<string> baseList, bool encryption = false, string confirmText = "")
         {
             Dialog dialog = new Dialog()
             {
@@ -210,6 +210,13 @@
                 TextID = StringId.Confirm,
             };
             contentView.AddChidren(btnConfirm);
+
+            //鑷畾涔塨tnConfirm鏍囬
+            if (!string.IsNullOrEmpty(confirmText))
+            {
+                btnConfirm.Text = confirmText;
+            }
+
             int mRectCornerID = HDLUtils.RectCornerBottomRight;
             btnConfirm.SetCornerWithSameRadius((uint)Application.GetMinRealAverage(10), mRectCornerID);
 
diff --git a/HDL_ON/UI/UI2/4-PersonalCenter/PersonalCenterPage.cs b/HDL_ON/UI/UI2/4-PersonalCenter/PersonalCenterPage.cs
index 17c99a0..19c3e2b 100644
--- a/HDL_ON/UI/UI2/4-PersonalCenter/PersonalCenterPage.cs
+++ b/HDL_ON/UI/UI2/4-PersonalCenter/PersonalCenterPage.cs
@@ -237,6 +237,7 @@
             contentView = new VerticalScrolViewLayout()
             {
                 Y = Application.GetRealHeight(8) + personalInfoView.Bottom,
+
                 Height = Application.GetRealHeight(400),
                 ScrollEnabled = false
             };
diff --git a/HDL_ON/UI/UI2/4-PersonalCenter/SmartSpeaker/SmartSpeakerListPage.cs b/HDL_ON/UI/UI2/4-PersonalCenter/SmartSpeaker/SmartSpeakerListPage.cs
index 1292090..c704948 100644
--- a/HDL_ON/UI/UI2/4-PersonalCenter/SmartSpeaker/SmartSpeakerListPage.cs
+++ b/HDL_ON/UI/UI2/4-PersonalCenter/SmartSpeaker/SmartSpeakerListPage.cs
@@ -2,16 +2,13 @@
 using Shared;
 using HDL_ON.UI.CSS;
 using System.Collections.Generic;
-using System.Threading;
 using HDL_ON.DAL.Server;
 
 namespace HDL_ON.UI
 {
 
-
     /// <summary>
     /// 鏅鸿兘闊崇鍒楄〃
-
     /// </summary>
     public class SmartSpeakerListPage : FrameLayout
     {
@@ -61,6 +58,7 @@
                 Y = bodyY,
                 Height = bodyView.Height - bodyY,
                 BackgroundColor = CSS_Color.BackgroundColor,
+
             };
             bodyView.AddChidren(bodyScrolView);
 
@@ -243,7 +241,8 @@
             };
             view2.AddChidren(btnNickname);
 
-            if (string.IsNullOrEmpty(speakerInfo.remark)) {
+            if (string.IsNullOrEmpty(speakerInfo.remark))
+            {
                 btnNickname.TextID = StringId.SmartSpeaker;
             }
 
@@ -276,9 +275,7 @@
 
             btnNickname.MouseUpEventHandler += (sender, e) =>
             {
-                new PublicAssmebly().LoadDialog_EditParater(StringId.Remarks, speakerInfo.remark, renameAction, StringId.RemarksCannotBeBlank, 0, new List<string>());
-
-                //HDLCommon.Current.ShowEditTextDialog(speakerInfo.remark, renameAction, Language.StringByID(R.MyInternationalizationString.rename));
+                new PublicAssmebly().LoadDialog_EditParater(StringId.Remarks, speakerInfo.remark, renameAction, StringId.RemarksCannotBeBlank, 0, new List<string>(),false, Language.StringByID(StringId.Save));
             };
             #endregion
 
@@ -323,8 +320,8 @@
 
             EventHandler<MouseEventArgs> eHandler = (sender, e) =>
             {
-                //璺宠浆椤甸潰
-                GotoSpeakerManagementPage(speakerInfo);
+                //璺宠浆鏁版嵁绠$悊鎴块棿鍒楄〃
+                GotoPage(speakerInfo);
             };
             view3.MouseUpEventHandler += eHandler;
             btnDataTitle.MouseUpEventHandler += eHandler;
@@ -360,6 +357,19 @@
             };
             view4.AddChidren(btnUnbindRight);
 
+            EventHandler<MouseEventArgs> eHandler4 = (sender, e) =>
+            {
+                Action okAction = () =>
+                {
+                    //瑙g粦闊崇
+                    UnbindSpeaker(speakerInfo, rowView, lineView);
+                };
+                new ConfirmDialog().ShowDialog(StringId.Tip, StringId.DoYouWantToUnbind, okAction, null, StringId.Cancel, StringId.Confirm);
+
+            };
+            view4.MouseUpEventHandler += eHandler4;
+            btnUnbindTitle.MouseUpEventHandler += eHandler4;
+            btnUnbindRight.MouseUpEventHandler += eHandler4;
 
             #endregion
 
@@ -464,25 +474,86 @@
         }
 
         /// <summary>
-        /// 璺宠浆AlexaDeviceListPage椤甸潰
+        /// 璇锋眰瑙g粦闊崇
         /// </summary>
-        /// <param name="speakerInfo"></param>
-        void GotoSpeakerManagementPage(SpeakerInfo speakerInfo)
+        /// <param name="speakerInfo">闊崇鍙傛暟</param>
+        /// <param name="rowView">闊崇rowView</param>
+        /// <param name="lineView">濉厖鐨刲ineView</param>
+        void UnbindSpeaker(SpeakerInfo speakerInfo, FrameLayout rowView, FrameLayout lineView)
         {
-            ////娌$粦瀹氬繕璁版彁绀哄厛缁戝畾缃戝叧锛岀姝㈣烦杞�
-            //if (!UserConfig.Instance.CheckWhetherGatewayIdNotNull())
-            //{
-            //    Utlis.ShowAlertOnMainThread(Language.StringByID(R.MyInternationalizationString.PleaseBindTheGatewayFirst));
-            //    return;
-            //}
+            if (speakerInfo == null || string.IsNullOrEmpty(speakerInfo.tokenId)) {
 
+                Utlis.ShowTip(Language.StringByID(StringId.RequestFailedParameterException) + "(-3)");
+            }
 
-            ////璺宠浆Alexa绠$悊椤甸潰
-            //AlexaDeviceListPage speakerInfoDeviceListPage = new AlexaDeviceListPage(speakerInfo);
-            //UserMiddle.SettingPageView.AddChidren(speakerInfoDeviceListPage);
-            //speakerInfoDeviceListPage.ShowPage();
-            //UserMiddle.SettingPageView.PageIndex = UserMiddle.SettingPageView.ChildrenCount - 1;
+            var waitPage = new Loading();
+            bodyView.AddChidren(waitPage);
+            waitPage.Start(Language.StringByID(StringId.PleaseWait));
+
+            System.Threading.Tasks.Task.Run(() =>
+            {
+                try
+                {
+                    var revertObj = new HttpServerRequest().UnbindSpeaker(speakerInfo.tokenId);
+                    if (revertObj.Code == StateCode.SUCCESS)
+                    {
+                        //瑙g粦鎴愬姛
+                        Application.RunOnMainThread(() =>
+                        {
+                            //lineView
+                            if (lineView != null)
+                            {
+                                lineView.RemoveFromParent();
+                            }
+
+                            //绉婚櫎rowView
+                            if (rowView != null)
+                            {
+                                rowView.RemoveFromParent();
+                            }
+                          
+                            //鎻愮ず瑙g粦鎴愬姛
+                            Utlis.ShowTip(Language.StringByID(StringId.UnbindEmailSuccess));
+
+                        });
+                    }
+                    else
+                    {
+                        //鎻愮ず閿欒
+                        IMessageCommon.Current.ShowErrorInfoAlter(revertObj.Code);
+                    }
+                }
+                catch
+                {
+
+                }
+                finally
+                {
+                    Application.RunOnMainThread(() =>
+                    {
+                        if (waitPage != null)
+                        {
+                            waitPage.RemoveFromParent();
+                            waitPage = null;
+                        }
+                    });
+                }
+            });
+
         }
+
+
+        /// <summary>
+        /// 
+        /// </summary>
+        void GotoPage(SpeakerInfo speakerInfo)
+        {
+            var page = new SmartSpeakerRoomListPage(speakerInfo);
+            MainPage.BasePageView.AddChidren(page);
+            page.LoadPage();
+            MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
+        }
+
     }
 
 
diff --git a/HDL_ON/UI/UI2/4-PersonalCenter/SmartSpeaker/SmartSpeakerRoomListPage.cs b/HDL_ON/UI/UI2/4-PersonalCenter/SmartSpeaker/SmartSpeakerRoomListPage.cs
new file mode 100644
index 0000000..e1895fa
--- /dev/null
+++ b/HDL_ON/UI/UI2/4-PersonalCenter/SmartSpeaker/SmartSpeakerRoomListPage.cs
@@ -0,0 +1,309 @@
+锘縰sing System;
+using Shared;
+using HDL_ON.UI.CSS;
+using System.Collections.Generic;
+using System.Threading;
+using HDL_ON.DAL.Server;
+using HDL_ON.Entity;
+
+namespace HDL_ON.UI
+{
+
+    /// <summary>
+    /// 鎴块棿鍒楄〃
+    /// </summary>
+    public class SmartSpeakerRoomListPage : FrameLayout
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        FrameLayout bodyView;
+       
+        /// <summary>
+        /// 褰撳墠
+        /// </summary>
+        VerticalScrolViewLayout bodyScrolView;
+        /// <summary>
+        /// 闊崇鍙傛暟
+        /// </summary>
+        SpeakerInfo speakerInfo;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public SmartSpeakerRoomListPage(SpeakerInfo speakerInfo)
+        {
+            bodyView = this;
+            bodyView.BackgroundColor = CSS_Color.BackgroundColor;
+            this.speakerInfo = speakerInfo;
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public void LoadPage()
+        {
+            new TopViewDiv(bodyView, Language.StringByID(StringId.DataManagement)).LoadTopView();
+
+            int bodyY = Application.GetRealHeight(64);
+            bodyScrolView = new VerticalScrolViewLayout()
+            {
+                Y = bodyY,
+                Height = bodyView.Height - bodyY,
+                BackgroundColor = CSS_Color.BackgroundColor,
+
+            };
+            bodyView.AddChidren(bodyScrolView);
+
+
+            //LoadSmartSpeakertListView(bodyScrolView);
+            ShowRoomListView();
+        }
+
+        /// <summary>
+        /// 鍔犺浇鎴块棿鍒楄〃,缁熻鍒嗕韩鐨勬暟鎹�
+        /// </summary>
+        void ShowRoomListView()
+        {
+            bodyScrolView.RemoveAll();
+
+            var titleView = new FrameLayout()
+            {
+                BackgroundColor = CSS_Color.MainBackgroundColor,
+                Height = Application.GetRealWidth(44),
+            };
+            bodyScrolView.AddChidren(titleView);
+
+            var btnTitle = new Button()
+            {
+                X = Application.GetRealWidth(16),
+                TextAlignment = TextAlignment.CenterLeft,
+                TextColor = CSS_Color.FirstLevelTitleColor,
+                TextSize = CSS_FontSize.SubheadingFontSize,
+                TextID = StringId.UseArea,
+            };
+            titleView.AddChidren(btnTitle);
+
+            var btnLine = new Button()
+            {
+                X = Application.GetRealWidth(16),
+                Y = titleView.Height - Application.GetRealHeight(2),
+                Width = Application.GetRealWidth(360),
+                Height = Application.GetRealHeight(1),
+                BackgroundColor = CSS_Color.DividingLineColor,
+            };
+            titleView.AddChidren(btnLine);
+
+            //---------------------------------------------
+            //鏈垎閰嶅尯鍩熺殑鍔熻兘
+            List<Function> allFunctionList = FunctionList.List.GetDeviceFunctionList();
+            //鏈垎閰嶅尯鍩熺殑鍔熻兘
+            List<Function> unallocatedList = new List<Function>();
+            //
+            foreach (var function in allFunctionList)
+            {
+                function.roomIds.Remove(null);
+                if (function.roomIds.Count > 0)
+                {
+                    //allocatedList.Add(function);
+                }
+                else
+                {
+                    unallocatedList.Add(function);
+                }
+            }
+
+            //鎵�鏈夊満鏅�
+            List<Scene> allSceneList = FunctionList.List.scenes;
+            //鍏ㄥ眬鍦烘櫙鍦烘櫙
+            List<Scene> globalSceneList = new List<Scene>();
+            //鎵惧嚭鎵�鏈夌殑鍏ㄥ眬鍦烘櫙
+            foreach (var mScene in allSceneList)
+            {
+
+                //roomIds澶т簬0 浠h〃鍒嗛厤鍒版埧闂�
+                mScene.roomIds.Remove(null);
+                if (mScene.roomIds.Count > 0)
+                {
+                    //allocatedList.Add(function);
+                }
+                else
+                {
+                    globalSceneList.Add(mScene);
+                }
+            }
+
+
+            try
+            {
+                //閬嶅巻鍔犺浇鎴块棿鍒嗕韩涓暟缁熻鐘舵�丷owLayout
+                foreach (var room in SpatialInfo.CurrentSpatial.RoomList)
+                {
+                    AddRoomFunctionRowLayout(room);
+                }
+                //2020-12-16 鍔犺浇鏈垎閰嶅尯鍩熷姛鑳絉owLayout
+                AddNoAreaFunctionRowLayout(unallocatedList, globalSceneList);
+            }
+            catch
+            {
+                Utlis.WriteLine("AddRoomFunctionRowLayout error");
+            }
+        }
+
+
+        /// <summary>
+        /// 娣诲姞鎴块棿鍒楄〃
+        /// </summary>
+        /// <param name="mRoom"></param>
+        void AddRoomFunctionRowLayout(Room mRoom)
+        {
+            ShowBaseRoomFunOrNoAreaFunRowLayout(mRoom, null, null);
+        }
+
+        /// <summary>
+        /// 娣诲姞鏃犲尯鍩熺殑鍔熻兘
+        /// </summary>
+        /// <param name="unallocatedList">鏈垎閰嶇殑鎵�鏈夊姛鑳藉垪琛�</param>
+        /// <param name="globalSceneList">鍏ㄥ尯鍩熺殑鍦烘櫙</param>
+        void AddNoAreaFunctionRowLayout(List<Function> unallocatedList, List<Scene> globalSceneList)
+        {
+            ShowBaseRoomFunOrNoAreaFunRowLayout(null, unallocatedList, globalSceneList);
+        }
+
+        /// <summary>
+        /// 2020-12-17 閲嶆柊璋冩暣
+        /// 娣诲姞鎴块棿鍒嗕韩鎴栬�呮棤鍖哄煙鍒嗛厤 涓暟缁熻鐘舵�佺殑RowLayout
+        /// </summary>
+        /// <param name="room">濡傛灉鎴块棿涓虹┖锛屼唬琛ㄧ鐞嗘棤鍒嗛厤鍖哄煙</param>
+        /// <param name="unallocatedList">绠$悊鏃犲垎閰嶅尯鍩熸墠鏈夋晥</param>
+        /// <param name="globalSceneList">鍏ㄥ眬鍦烘櫙</param>
+        void ShowBaseRoomFunOrNoAreaFunRowLayout(Room mRoom, List<Function> unallocatedList, List<Scene> globalSceneList)
+        {
+            /// 鎴块棿鎵�鏈夊姛鑳藉拰鑰呭満鏅垪琛�
+            List<SpeakerTargetInfo> roomFunctionOrSceneList = new List<SpeakerTargetInfo>();
+
+            var roomView = new RowLayout()
+            {
+                Height = Application.GetRealWidth(50),
+                BackgroundColor = CSS_Color.MainBackgroundColor,
+                LineColor = CSS_Color.MainBackgroundColor,
+            };
+            bodyScrolView.AddChidren(roomView);
+
+            var btnRoomName = new Button()
+            {
+                X = Application.GetRealWidth(16),
+                Y = Application.GetRealWidth(10),
+                Width = Application.GetRealWidth(330),
+                Height = Application.GetRealWidth(30),
+                TextAlignment = TextAlignment.CenterLeft,
+                TextColor = CSS_Color.FirstLevelTitleColor,
+                TextSize = CSS_FontSize.TextFontSize,
+                //Text = room.roomName,
+            };
+            roomView.AddChidren(btnRoomName);
+
+            var btnRight = new Button()
+            {
+                X = Application.GetRealWidth(351),
+                Gravity = Gravity.CenterVertical,
+                Width = Application.GetMinRealAverage(16),
+                Height = Application.GetMinRealAverage(16),
+                UnSelectedImagePath = "Public/Right.png",
+            };
+            roomView.AddChidren(btnRight);
+
+            //濡傛灉鎴块棿涓虹┖锛屼唬琛ㄧ鐞嗘棤鍒嗛厤鍖哄煙
+            if (mRoom != null)
+            {
+                //鏄剧ず鎴块棿鍚�
+                btnRoomName.Text = mRoom.roomName;
+                var mRoomFunctionList = mRoom.GetRoomFunctions(false);
+                var mRoomSceneList = mRoom.GetRoomScenes(true);
+                //閬嶅巻鎵�鏈夊姛鑳藉垪琛�
+                if (mRoomFunctionList != null)
+                {
+                    foreach (var fun in mRoomFunctionList)
+                    {
+                        roomFunctionOrSceneList.Add(new SpeakerTargetInfo()
+                        {
+                            targetId = fun.deviceId,
+                            targetName = fun.name,
+                            isDevice = true
+                        });
+                    }
+                }
+
+                //閬嶅巻鎵�鏈夊満鏅垪琛�
+                if (mRoomSceneList != null)
+                {
+                    foreach (var roomScene in mRoomSceneList)
+                    {
+                        roomFunctionOrSceneList.Add(new SpeakerTargetInfo()
+                        {
+                            targetId = roomScene.userSceneId,
+                            targetName = roomScene.name,
+                            isDevice = false
+                        });
+                    }
+                }
+
+                //roomId = mRoom.roomId;
+                //娣诲姞鍒嗗壊绾�
+                var lineView = new LineView(roomView.Height - Application.GetRealHeight(1));
+                roomView.AddChidren(lineView);
+            }
+            else
+            {
+                //鏄剧ず鏃犲尯鍩熷姛鑳�
+                btnRoomName.TextID = StringId.NoAreaFunction;
+
+                //閬嶅巻鎵�鏈夊姛鑳藉垪琛�
+                if (unallocatedList != null)
+                {
+                    foreach (var fun in unallocatedList)
+                    {
+                        roomFunctionOrSceneList.Add(new SpeakerTargetInfo()
+                        {
+                            targetId = fun.deviceId,
+                            targetName = fun.name,
+                            isDevice = true
+                        });
+                    }
+                }
+
+                //閬嶅巻鎵�鏈夊満鏅垪琛�
+                if (globalSceneList != null)
+                {
+                    foreach (var roomScene in globalSceneList)
+                    {
+                        roomFunctionOrSceneList.Add(new SpeakerTargetInfo()
+                        {
+                            targetId = roomScene.userSceneId,
+                            targetName = roomScene.name,
+                            isDevice = false
+                        });
+                    }
+                }
+            }
+
+          
+            //鐐瑰嚮璋冩暣浜嬩欢
+            EventHandler<MouseEventArgs> eHandler = (sender, e) =>
+            {
+                var page = new SmartSpeakerSelectDevicesPage(speakerInfo, roomFunctionOrSceneList);
+                MainPage.BasePageView.AddChidren(page);
+                page.LoadPage();
+                MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
+            };
+            roomView.MouseUpEventHandler = eHandler;
+            btnRoomName.MouseUpEventHandler = eHandler;
+            btnRight.MouseUpEventHandler = eHandler;
+          
+        }
+
+    }
+
+
+
+}
diff --git "a/HDL_ON/UI/UI2/4-PersonalCenter/SmartSpeaker/SmartSpeakerSelectDevicesPage \050\345\211\257\346\234\254\051.cs" "b/HDL_ON/UI/UI2/4-PersonalCenter/SmartSpeaker/SmartSpeakerSelectDevicesPage \050\345\211\257\346\234\254\051.cs"
new file mode 100644
index 0000000..91f1cee
--- /dev/null
+++ "b/HDL_ON/UI/UI2/4-PersonalCenter/SmartSpeaker/SmartSpeakerSelectDevicesPage \050\345\211\257\346\234\254\051.cs"
@@ -0,0 +1,422 @@
+锘�//using System;
+//using Shared;
+//using HDL_ON.UI.CSS;
+//using System.Collections.Generic;
+//using System.Threading;
+//using HDL_ON.DAL.Server;
+
+//namespace HDL_ON.UI
+//{
+
+//    /// <summary>
+//    /// 绠$悊閰嶇疆缁欓煶绠辩殑璁惧鍒楄〃
+//    /// </summary>
+//    public class SmartSpeakerSelectDevicesPage : FrameLayout
+//    {
+//        /// <summary>
+//        /// 
+//        /// </summary>
+//        FrameLayout bodyView;
+//        /// <summary>
+//        /// 鍏ㄩ�夋寜閽�
+//        /// </summary>
+//        Button btnChooseAll;
+//        /// <summary>
+//        /// 褰撳墠
+//        /// </summary>
+//        VerticalScrolViewLayout bodyScrolView;
+//        ///// <summary>
+//        ///// 搴曢儴淇濆瓨鎿嶄綔鎸夐挳
+//        ///// </summary>
+//        //Button btnSave;
+
+//        /// <summary>
+//        /// 闊崇鍙傛暟
+//        /// </summary>
+//        SpeakerInfo speakerInfo;
+
+//        /// <summary>
+//        /// 璁惧銆佸満鏅垪琛�
+//        /// </summary>
+//        List<SpeakerTargetInfo> targetInfoList = new List<SpeakerTargetInfo>();
+//        ///// <summary>
+//        ///// 绠$悊褰撳墠閫夋嫨閫夌殑璁惧銆佸満鏅垪琛�
+//        ///// </summary>
+//        //List<SpeakerTargetInfo> selectInfoList = new List<SpeakerTargetInfo>();
+
+//        /// <summary>
+//        /// 褰撳墠鎴块棿鐨勮澶囧拰鍦烘櫙
+//        /// </summary>
+//        List<SpeakerTargetInfo> roomFunctionOrSceneList = new List<SpeakerTargetInfo>();
+
+//        /// <summary>
+//        /// 
+//        /// </summary>
+//        /// <param name="speakerInfo"></param>
+//        /// <param name="roomFunctionOrSceneList"></param>
+//        public SmartSpeakerSelectDevicesPage(SpeakerInfo speakerInfo, List<SpeakerTargetInfo> roomFunctionOrSceneList)
+//        {
+//            bodyView = this;
+//            bodyView.BackgroundColor = CSS_Color.MainBackgroundColor;
+//            this.speakerInfo = speakerInfo;
+//            this.roomFunctionOrSceneList = roomFunctionOrSceneList;
+//        }
+
+//        /// <summary>
+//        /// 
+//        /// </summary>
+//        public void LoadPage()
+//        {
+//            new TopViewDiv(bodyView, Language.StringByID(StringId.DataManagement)).LoadTopView();
+
+//            //椤堕儴鍏ㄩ�夋寜閽�
+//            var allRoomView = new FrameLayout()
+//            {
+//                Y = Application.GetRealHeight(64),
+//                Height = Application.GetRealHeight(50),
+//                BackgroundColor = CSS_Color.MainBackgroundColor,
+//            };
+//            bodyView.AddChidren(allRoomView);
+
+//            Button btnAllRoomText = new Button()
+//            {
+//                X = Application.GetRealWidth(16),
+//                Width = Application.GetRealWidth(280),
+//                TextID = StringId.SelectedAll,
+//                TextSize = CSS_FontSize.SubheadingFontSize,
+//                TextColor = CSS_Color.FirstLevelTitleColor,
+//                TextAlignment = TextAlignment.CenterLeft,
+//            };
+//            allRoomView.AddChidren(btnAllRoomText);
+
+//            btnChooseAll = new Button()
+//            {
+//                X = Application.GetRealWidth(331),
+//                Gravity = Gravity.CenterVertical,
+//                Width = Application.GetMinRealAverage(28),
+//                Height = Application.GetMinRealAverage(28),
+//                UnSelectedImagePath = "Public/ChooseIcon.png",
+//                SelectedImagePath = "Public/ChooseOnIcon.png",
+//                IsSelected = true,
+//            };
+//            allRoomView.AddChidren(btnChooseAll);
+
+//            allRoomView.AddChidren(new Button()
+//            {
+//                Gravity = Gravity.CenterHorizontal,
+//                Y = Application.GetRealHeight(49),
+//                Height = Application.GetMinReal(1),
+//                Width = Application.GetRealWidth(343),
+//                BackgroundColor = CSS_Color.DividingLineColor,
+//            });
+
+//            bodyScrolView = new VerticalScrolViewLayout()
+//            {
+//                Y = allRoomView.Bottom,
+//                Height = Application.GetRealHeight(450),
+//            };
+//            bodyView.AddChidren(bodyScrolView);
+
+//            var btnSave = new ConfirmButton()
+//            {
+//                Y = Application.GetRealHeight(519 + 64),
+//                TextID = StringId.Save
+//            };
+//            bodyView.AddChidren(btnSave);
+
+//            //鍏ㄩ�夋寜閽偣鍑讳簨浠�
+//            LoadEvent_AllSharedDataChange(allRoomView, btnChooseAll);
+//            LoadEvent_Save(btnSave);
+
+//            GetDeviceAndSceneList();
+//        }
+
+
+//        /// <summary>
+//        /// 鍏ㄩ�夋寜閽偣鍑讳簨浠�
+//        /// </summary>
+//        void LoadEvent_AllSharedDataChange(FrameLayout allRoomView, Button btnChooseAll)
+//        {
+//            EventHandler<MouseEventArgs> eventHandler = (sender, e) =>
+//            {
+//                btnChooseAll.IsSelected = !btnChooseAll.IsSelected;
+//                if(selectInfoList == null)
+//                {
+//                    selectInfoList = new List<SpeakerTargetInfo>();
+//                }
+            
+//                if (btnChooseAll.IsSelected)
+//                {
+//                    foreach (var info in roomFunctionOrSceneList)
+//                    {
+//                        selectInfoList.Add(info);
+//                    }
+//                }
+//                RefreshListView();
+//            };
+//            btnChooseAll.MouseUpEventHandler = eventHandler;
+//            allRoomView.MouseUpEventHandler = eventHandler;
+
+//        }
+
+//        /// <summary>
+//        /// 淇濆瓨鎸夐挳鐐瑰嚮浜嬩欢
+//        /// </summary>
+//        /// <param name="btnSave"></param>
+//        void LoadEvent_Save(Button btnSave)
+//        {
+//            EventHandler<MouseEventArgs> eventHandler = (sender, e) =>
+//            {
+//                AddDevicesSceneList(targetInfoList);
+//            };
+
+//            btnSave.MouseUpEventHandler = eventHandler;
+//        }
+
+//        /// <summary>
+//        /// 
+//        /// </summary>
+//        /// <param name="updateList"></param>
+//        void AddDevicesSceneList(List<SpeakerTargetInfo> updateList)
+//        {
+//            var waitPage = new Loading();
+//            bodyView.AddChidren(waitPage);
+//            waitPage.Start(Language.StringByID(StringId.PleaseWait));
+
+//            System.Threading.Tasks.Task.Run(() =>
+//            {
+//                try
+//                {
+//                    var updateSpeakerDeviceListObj = new UpdateSpeakerDeviceListObj()
+//                    {
+//                        homeId = speakerInfo.homeId,
+//                        tokenId = speakerInfo.tokenId,
+//                        targetInfos = updateList
+//                    };
+
+//                    var revertObj = new HttpServerRequest().UpdateSpeakerDeviceList(updateSpeakerDeviceListObj);
+//                    if (revertObj.Code == StateCode.SUCCESS)
+//                    {
+//                        Application.RunOnMainThread(() =>
+//                        {
+//                            //淇濆瓨鎴愬姛銆侀〉闈㈠叧闂�
+//                            Utlis.ShowTip(Language.StringByID(StringId.SavedSuccessfully));
+//                            if (bodyView != null)
+//                            {
+//                                bodyView.RemoveFromParent();
+//                            }
+//                        });
+
+//                    }
+//                    else
+//                    {
+//                        //鎻愮ず閿欒
+//                        IMessageCommon.Current.ShowErrorInfoAlter(revertObj.Code);
+//                    }
+//                }
+//                catch
+//                {
+
+//                }
+//                finally
+//                {
+//                    Application.RunOnMainThread(() =>
+//                    {
+//                        if (waitPage != null)
+//                        {
+//                            waitPage.RemoveFromParent();
+//                            waitPage = null;
+//                        }
+//                    });
+//                }
+//            });
+//        }
+       
+//        /// <summary>
+//        /// 鍔犺浇鎴块棿鐨勮澶囧拰鍦烘櫙鍒楄〃
+//        /// </summary>
+//        void GetDeviceAndSceneList()
+//        {
+//            bodyScrolView.RemoveAll();
+
+//            var waitPage = new Loading();
+//            bodyView.AddChidren(waitPage);
+//            waitPage.Start(Language.StringByID(StringId.PleaseWait));
+
+//            System.Threading.Tasks.Task.Run(() =>
+//            {
+//                try
+//                {
+//                    var revertObj = new HttpServerRequest().GetSpeakerDeviceList(0, speakerInfo.tokenId);
+//                    if (revertObj.Code == StateCode.SUCCESS)
+//                    {
+//                        var list = Newtonsoft.Json.JsonConvert.DeserializeObject<List<SpeakerTargetInfo>>(revertObj.Data.ToString());
+//                        Application.RunOnMainThread(() => {
+//                            if (list != null && list.Count > 0)
+//                            {
+//                                targetInfoList = list;
+//                            }
+//                            else
+//                            {
+//                                targetInfoList = new List<SpeakerTargetInfo>();
+//                            }
+//                            RefreshListView();
+//                        });
+
+//                    }
+//                    else
+//                    {
+//                        //鎻愮ず閿欒
+//                        IMessageCommon.Current.ShowErrorInfoAlter(revertObj.Code);
+//                    }
+//                }
+//                catch
+//                {
+
+//                }
+//                finally
+//                {
+//                    Application.RunOnMainThread(() =>
+//                    {
+//                        if (waitPage != null)
+//                        {
+//                            waitPage.RemoveFromParent();
+//                            waitPage = null;
+//                        }
+//                    });
+//                }
+//            });
+//        }
+
+//        /// <summary>
+//        /// 
+//        /// </summary>
+//        void RefreshListView()
+//        {
+//            bodyScrolView.RemoveAll();
+
+//            if (roomFunctionOrSceneList == null) return;
+
+//            foreach (var roomData in roomFunctionOrSceneList)
+//            {
+//                AddRowView(roomData);
+//            }
+
+
+//        }
+    
+
+//       /// <summary>
+//       /// 
+//       /// </summary>
+//       /// <param name="info"></param>
+//        void AddRowView(SpeakerTargetInfo info)
+//        {
+
+//            var roomView = new FrameLayout()
+//            {
+//                Height = Application.GetRealHeight(50),
+//                BackgroundColor = CSS_Color.MainBackgroundColor,
+//                Tag = "row"
+//            };
+//            bodyScrolView.AddChidren(roomView);
+
+//            Button btnRoomText = new Button()
+//            {
+//                X = Application.GetRealWidth(16),
+//                Width = Application.GetRealWidth(280),
+//                TextSize = CSS_FontSize.SubheadingFontSize,
+//                TextColor = CSS_Color.FirstLevelTitleColor,
+//                TextAlignment = TextAlignment.CenterLeft,
+//                Text = info.targetName,
+//            };
+//            roomView.AddChidren(btnRoomText);
+
+//            Button btnChoose = new Button()
+//            {
+//                X = Application.GetRealWidth(331),
+//                Gravity = Gravity.CenterVertical,
+//                Width = Application.GetMinRealAverage(28),
+//                Height = Application.GetMinRealAverage(28),
+//                UnSelectedImagePath = "Public/ChooseIcon.png",
+//                SelectedImagePath = "Public/ChooseOnIcon.png",
+//                Tag = "ChooseIcon"
+//            };
+//            roomView.AddChidren(btnChoose);
+
+//            var targetData = selectInfoList.Find((obj) => obj.targetId == info.targetId);
+//            if (targetData != null)
+//            {
+//                btnChoose.IsSelected = true;
+//                //鍒锋柊灞炰簬褰撳墠鎴块棿鐨勫垎浜粺璁�
+//                //funs_New.Add(shareData);
+//            }
+//            else
+//            {
+//                if (btnChooseAll.IsSelected)
+//                    btnChooseAll.IsSelected = false;
+//            }
+
+
+//            var btnLine = new Button()
+//            {
+//                Gravity = Gravity.CenterHorizontal,
+//                //Y = Application.GetRealHeight(49),
+//                Height = Application.GetRealHeight(1),
+//                Width = Application.GetRealWidth(343),
+//                BackgroundColor = CSS_Color.DividingLineColor,
+//            };
+//            bodyScrolView.AddChidren(btnLine);
+
+
+//            EventHandler<MouseEventArgs> eventHandler = (sender, e) =>
+//            {
+//                btnChoose.IsSelected = !btnChoose.IsSelected;
+//                var sd = selectInfoList.Find((obj) => obj.targetId == info.targetId);
+//                if (btnChoose.IsSelected)
+//                {
+//                    try
+//                    {
+//                        if (null == sd)
+//                        {
+//                            selectInfoList.Add(info);
+//                        }
+//                        btnChooseAll.IsSelected = true;
+
+//                        foreach (var f in roomFunctionOrSceneList)
+//                        {
+//                            if (selectInfoList.Find((obj) => obj.targetId == f.targetId) == null)
+//                            {
+//                                btnChooseAll.IsSelected = false;
+//                                break;
+//                            }
+//                        }
+//                    }
+//                    catch (Exception ex)
+//                    {
+//                        MainPage.Log($"Evhaaa {ex.Message}");
+//                    }
+//                }
+//                else
+//                {
+//                    if (null != sd)
+//                    {
+//                        selectInfoList.Remove(sd);
+//                    }
+//                    btnChooseAll.IsSelected = false;
+//                }
+//            };
+
+//            btnChoose.MouseUpEventHandler = eventHandler;
+//            roomView.MouseUpEventHandler = eventHandler;
+//            btnRoomText.MouseUpEventHandler = eventHandler;
+
+
+//        }
+
+     
+//    }
+
+
+
+//}
diff --git a/HDL_ON/UI/UI2/4-PersonalCenter/SmartSpeaker/SmartSpeakerSelectDevicesPage.cs b/HDL_ON/UI/UI2/4-PersonalCenter/SmartSpeaker/SmartSpeakerSelectDevicesPage.cs
new file mode 100644
index 0000000..b06bea9
--- /dev/null
+++ b/HDL_ON/UI/UI2/4-PersonalCenter/SmartSpeaker/SmartSpeakerSelectDevicesPage.cs
@@ -0,0 +1,437 @@
+锘縰sing System;
+using Shared;
+using HDL_ON.UI.CSS;
+using System.Collections.Generic;
+using System.Threading;
+using HDL_ON.DAL.Server;
+
+namespace HDL_ON.UI
+{
+
+    /// <summary>
+    /// 绠$悊閰嶇疆缁欓煶绠辩殑璁惧鍒楄〃
+    /// </summary>
+    public class SmartSpeakerSelectDevicesPage : FrameLayout
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        FrameLayout bodyView;
+        /// <summary>
+        /// 鍏ㄩ�夋寜閽�
+        /// </summary>
+        Button btnChooseAll;
+        /// <summary>
+        /// 褰撳墠
+        /// </summary>
+        VerticalScrolViewLayout bodyScrolView;
+        ///// <summary>
+        ///// 搴曢儴淇濆瓨鎿嶄綔鎸夐挳
+        ///// </summary>
+        //Button btnSave;
+
+        /// <summary>
+        /// 闊崇鍙傛暟
+        /// </summary>
+        SpeakerInfo speakerInfo;
+
+        /// <summary>
+        /// 璁惧銆佸満鏅垪琛�
+        /// </summary>
+        List<SpeakerTargetInfo> targetInfoList = new List<SpeakerTargetInfo>();
+        
+        /// <summary>
+        /// 褰撳墠鎴块棿鐨勮澶囧拰鍦烘櫙
+        /// </summary>
+        List<SpeakerTargetInfo> roomFunctionOrSceneList = new List<SpeakerTargetInfo>();
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="speakerInfo"></param>
+        /// <param name="roomFunctionOrSceneList"></param>
+        public SmartSpeakerSelectDevicesPage(SpeakerInfo speakerInfo, List<SpeakerTargetInfo> roomFunctionOrSceneList)
+        {
+            bodyView = this;
+            bodyView.BackgroundColor = CSS_Color.MainBackgroundColor;
+            this.speakerInfo = speakerInfo;
+            this.roomFunctionOrSceneList = roomFunctionOrSceneList;
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public void LoadPage()
+        {
+            new TopViewDiv(bodyView, Language.StringByID(StringId.DataManagement)).LoadTopView();
+
+            //椤堕儴鍏ㄩ�夋寜閽�
+            var allRoomView = new FrameLayout()
+            {
+                Y = Application.GetRealHeight(64),
+                Height = Application.GetRealHeight(50),
+                BackgroundColor = CSS_Color.MainBackgroundColor,
+            };
+            bodyView.AddChidren(allRoomView);
+
+            Button btnAllRoomText = new Button()
+            {
+                X = Application.GetRealWidth(16),
+                Width = Application.GetRealWidth(280),
+                TextID = StringId.SelectedAll,
+                TextSize = CSS_FontSize.SubheadingFontSize,
+                TextColor = CSS_Color.FirstLevelTitleColor,
+                TextAlignment = TextAlignment.CenterLeft,
+            };
+            allRoomView.AddChidren(btnAllRoomText);
+
+            btnChooseAll = new Button()
+            {
+                X = Application.GetRealWidth(331),
+                Gravity = Gravity.CenterVertical,
+                Width = Application.GetMinRealAverage(28),
+                Height = Application.GetMinRealAverage(28),
+                UnSelectedImagePath = "Public/ChooseIcon.png",
+                SelectedImagePath = "Public/ChooseOnIcon.png",
+                //IsSelected = true,
+            };
+            allRoomView.AddChidren(btnChooseAll);
+
+            allRoomView.AddChidren(new Button()
+            {
+                Gravity = Gravity.CenterHorizontal,
+                Y = Application.GetRealHeight(49),
+                Height = Application.GetMinReal(1),
+                Width = Application.GetRealWidth(343),
+                BackgroundColor = CSS_Color.DividingLineColor,
+            });
+
+            bodyScrolView = new VerticalScrolViewLayout()
+            {
+                Y = allRoomView.Bottom,
+                Height = Application.GetRealHeight(450),
+            };
+            bodyView.AddChidren(bodyScrolView);
+
+            var btnSave = new ConfirmButton()
+            {
+                Y = Application.GetRealHeight(519 + 64),
+                TextID = StringId.Save
+            };
+            bodyView.AddChidren(btnSave);
+
+            //鍏ㄩ�夋寜閽偣鍑讳簨浠�
+            LoadEvent_AllSharedDataChange(allRoomView, btnChooseAll);
+            LoadEvent_Save(btnSave);
+
+            GetDeviceAndSceneList();
+        }
+
+
+        /// <summary>
+        /// 鍏ㄩ�夋寜閽偣鍑讳簨浠�
+        /// </summary>
+        void LoadEvent_AllSharedDataChange(FrameLayout allRoomView, Button btnChooseAll)
+        {
+            EventHandler<MouseEventArgs> eventHandler = (sender, e) =>
+            {
+                btnChooseAll.IsSelected = !btnChooseAll.IsSelected;
+                var IsSelected = btnChooseAll.IsSelected;
+
+                foreach (var info in roomFunctionOrSceneList)
+                {
+                    info.IsSelect = IsSelected;
+                }
+
+                RefreshListView();
+            };
+            btnChooseAll.MouseUpEventHandler = eventHandler;
+            allRoomView.MouseUpEventHandler = eventHandler;
+
+        }
+
+        /// <summary>
+        /// 淇濆瓨鎸夐挳鐐瑰嚮浜嬩欢
+        /// </summary>
+        /// <param name="btnSave"></param>
+        void LoadEvent_Save(Button btnSave)
+        {
+            EventHandler<MouseEventArgs> eventHandler = (sender, e) =>
+            {
+                AddDevicesSceneList(targetInfoList);
+            };
+
+            btnSave.MouseUpEventHandler = eventHandler;
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="updateList"></param>
+        void AddDevicesSceneList(List<SpeakerTargetInfo> updateList)
+        {
+            var waitPage = new Loading();
+            bodyView.AddChidren(waitPage);
+            waitPage.Start(Language.StringByID(StringId.PleaseWait));
+
+            System.Threading.Tasks.Task.Run(() =>
+            {
+                try
+                {
+                    //鏌ユ壘闇�瑕侀�変腑鐨勭洰鏍�
+                    foreach (var info in roomFunctionOrSceneList)
+                    {
+                        var targetData = updateList.Find((obj) => obj.targetId == info.targetId);
+                        if (info.IsSelect)
+                        {
+                            if (targetData == null)
+                            {
+                                updateList.Add(info);
+                            }
+
+                        }
+                        else
+                        {
+                            if (targetData != null)
+                            {
+                                updateList.Remove(targetData);
+                            }
+                        }
+
+                        
+                    }
+
+
+                    var updateSpeakerDeviceListObj = new UpdateSpeakerDeviceListObj()
+                    {
+                        homeId = speakerInfo.homeId,
+                        tokenId = speakerInfo.tokenId,
+                        targetInfos = updateList
+                    };
+
+                    var revertObj = new HttpServerRequest().UpdateSpeakerDeviceList(updateSpeakerDeviceListObj);
+                    if (revertObj.Code == StateCode.SUCCESS)
+                    {
+                        Application.RunOnMainThread(() =>
+                        {
+                            //淇濆瓨鎴愬姛銆侀〉闈㈠叧闂�
+                            Utlis.ShowTip(Language.StringByID(StringId.SavedSuccessfully));
+                            if (bodyView != null)
+                            {
+                                bodyView.RemoveFromParent();
+                            }
+                        });
+
+                    }
+                    else
+                    {
+                        //鎻愮ず閿欒
+                        IMessageCommon.Current.ShowErrorInfoAlter(revertObj.Code);
+                    }
+                }
+                catch
+                {
+
+                }
+                finally
+                {
+                    Application.RunOnMainThread(() =>
+                    {
+                        if (waitPage != null)
+                        {
+                            waitPage.RemoveFromParent();
+                            waitPage = null;
+                        }
+                    });
+                }
+            });
+        }
+       
+        /// <summary>
+        /// 鍔犺浇鎴块棿鐨勮澶囧拰鍦烘櫙鍒楄〃
+        /// </summary>
+        void GetDeviceAndSceneList()
+        {
+            bodyScrolView.RemoveAll();
+
+            var waitPage = new Loading();
+            bodyView.AddChidren(waitPage);
+            waitPage.Start(Language.StringByID(StringId.PleaseWait));
+
+            System.Threading.Tasks.Task.Run(() =>
+            {
+                try
+                {
+                    var revertObj = new HttpServerRequest().GetSpeakerDeviceList(0, speakerInfo.tokenId);
+                    if (revertObj.Code == StateCode.SUCCESS)
+                    {
+                        var list = Newtonsoft.Json.JsonConvert.DeserializeObject<List<SpeakerTargetInfo>>(revertObj.Data.ToString());
+                        if (list != null && list.Count > 0)
+                        {
+                            targetInfoList = list;
+                        }
+                        else
+                        {
+                            targetInfoList = new List<SpeakerTargetInfo>();
+                        }
+
+                        //榛樿鍏ㄩ��
+                        bool isSelectAll = true;
+                        //鏌ユ壘闇�瑕侀�変腑鐨勭洰鏍�
+                        foreach (var info in roomFunctionOrSceneList)
+                        {
+                            var targetData = targetInfoList.Find((obj) => obj.targetId == info.targetId);
+                            if(targetData == null)
+                            {
+                                info.IsSelect = false;
+                                //鏈変竴涓病閫夋嫨鍒欏叏閫夎缃负false
+                                isSelectAll = false;
+                            }
+                            else
+                            {
+                                info.IsSelect = true;
+                            }
+                        }
+
+                        Application.RunOnMainThread(() => {
+                            //璁剧疆褰撳墠鍏ㄩ��
+                            btnChooseAll.IsSelected = isSelectAll;
+                            RefreshListView();
+                        });
+
+                    }
+                    else
+                    {
+                        //鎻愮ず閿欒
+                        IMessageCommon.Current.ShowErrorInfoAlter(revertObj.Code);
+                    }
+                }
+                catch
+                {
+
+                }
+                finally
+                {
+                    Application.RunOnMainThread(() =>
+                    {
+                        if (waitPage != null)
+                        {
+                            waitPage.RemoveFromParent();
+                            waitPage = null;
+                        }
+                    });
+                }
+            });
+        }
+
+        /// <summary>
+        /// RefreshListView
+        /// </summary>
+        void RefreshListView()
+        {
+            bodyScrolView.RemoveAll();
+
+            if (roomFunctionOrSceneList == null) return;
+
+            foreach (var roomData in roomFunctionOrSceneList)
+            {
+                AddRowView(roomData);
+            }
+
+        }
+
+
+        /// <summary>
+        /// AddRowView
+        /// </summary>
+        /// <param name="info"></param>
+        void AddRowView(SpeakerTargetInfo info)
+        {
+
+            var roomView = new FrameLayout()
+            {
+                Height = Application.GetRealHeight(50),
+                BackgroundColor = CSS_Color.MainBackgroundColor,
+                Tag = "row"
+            };
+            bodyScrolView.AddChidren(roomView);
+
+            Button btnRoomText = new Button()
+            {
+                X = Application.GetRealWidth(16),
+                Width = Application.GetRealWidth(280),
+                TextSize = CSS_FontSize.SubheadingFontSize,
+                TextColor = CSS_Color.FirstLevelTitleColor,
+                TextAlignment = TextAlignment.CenterLeft,
+                Text = info.targetName,
+            };
+            roomView.AddChidren(btnRoomText);
+
+            Button btnChoose = new Button()
+            {
+                X = Application.GetRealWidth(331),
+                Gravity = Gravity.CenterVertical,
+                Width = Application.GetMinRealAverage(28),
+                Height = Application.GetMinRealAverage(28),
+                UnSelectedImagePath = "Public/ChooseIcon.png",
+                SelectedImagePath = "Public/ChooseOnIcon.png",
+                Tag = "ChooseIcon"
+            };
+            roomView.AddChidren(btnChoose);
+
+            btnChoose.IsSelected = info.IsSelect;
+
+            var btnLine = new Button()
+            {
+                Gravity = Gravity.CenterHorizontal,
+                //Y = Application.GetRealHeight(49),
+                Height = Application.GetRealHeight(1),
+                Width = Application.GetRealWidth(343),
+                BackgroundColor = CSS_Color.DividingLineColor,
+            };
+            bodyScrolView.AddChidren(btnLine);
+
+
+            EventHandler<MouseEventArgs> eventHandler = (sender, e) =>
+            {
+                btnChoose.IsSelected = !btnChoose.IsSelected;
+                info.IsSelect = btnChoose.IsSelected;
+                //1.濡傛灉鐐瑰嚮閫夋嫨锛屽垽鏂槸鍚﹂渶瑕佽缃叏閫�
+                if (btnChoose.IsSelected)
+                {
+                    //1.1 榛樿鍏ㄩ��
+                    bool isSelectAll = true;
+                    foreach (var targetInfo in roomFunctionOrSceneList)
+                    {
+                        if(targetInfo.IsSelect == false)
+                        {
+                            //1.2 鏈変竴涓繕娌¢�変腑灏遍��鍑猴紝鏃犻渶閫変腑鍏ㄩ�夋寜閽�
+                            isSelectAll = false;
+                            break;
+                        }
+                    }
+
+                    if (isSelectAll)
+                    {
+                        btnChooseAll.IsSelected = true;
+                    }
+                }
+                else
+                {
+                    //鍙栨秷鍏ㄩ��
+                    if (btnChooseAll.IsSelected)
+                    {
+                        btnChooseAll.IsSelected = false;
+                    }
+                }
+
+            };
+
+            btnChoose.MouseUpEventHandler = eventHandler;
+            roomView.MouseUpEventHandler = eventHandler;
+            btnRoomText.MouseUpEventHandler = eventHandler;
+        }
+
+     
+    }
+}

--
Gitblit v1.8.0