JLChen
2020-12-09 e87985ec1dcb69beedaf9f95e8e7aba14b7c08d6
HDL_ON/Common/HDLCommon.cs
@@ -2,30 +2,37 @@
using Shared;
using HDL_ON;
using HDL_ON.UI.CSS;
using HDL_ON.DAL.Server;
using HDL_ON.UI;
using HDL_ON.Entity;
namespace HDL_ON
{
    /// <summary>
    /// HDLCommon
    /// 暂时没用
    /// </summary>
    public class HDLCommon
    {
      #region ■ 变量声明___________________________
      /// <summary>
      /// 通用方法
      /// </summary>
      private static HDLCommon m_Current = null;
      /// <summary>
      /// 通用方法
      /// </summary>
      public static HDLCommon Current
      {
         get
         {
            if (m_Current == null)
            {
               m_Current = new HDLCommon();
            }
            return m_Current;
         }
      }
        #region ■ 变量声明___________________________
        /// <summary>
        /// 通用方法
        /// </summary>
        private static HDLCommon m_Current = null;
        /// <summary>
        /// 通用方法
        /// </summary>
        public static HDLCommon Current
        {
            get
            {
                if (m_Current == null)
                {
                    m_Current = new HDLCommon();
                }
                return m_Current;
            }
        }
        #endregion
        #region ■ Alter弹窗提示_______________________
@@ -46,7 +53,8 @@
        public void ShowActionAlert(string mes, Action okAction)
        {
            Alert alert = new Alert("", mes, Language.StringByID(StringId.Cancel), Language.StringByID(StringId.Confirm));
            alert.ResultEventHandler += (sender2, e2) => {
            alert.ResultEventHandler += (sender2, e2) =>
            {
                if (e2)
                {
                    okAction?.Invoke();
@@ -58,136 +66,276 @@
        #endregion
        #region ■ 通用Dialog_______________________
        /// <summary>
        /// 加载提示Dialog
        /// </summary>
        /// <param name="titleId"></param>
        /// <param name="msgId"></param>
        /// <param name="callBackAction"></param>
        void ShowConfirmDialogBase(int titleId, int msgId, Action okAction, Action cancelAction, int cancelID = StringId.Cancel, int confirmID = StringId.Confirm)
        {
            Dialog dialog = new Dialog()
            {
                BackgroundColor = CSS_Color.DialogTransparentColor1,
            };
            FrameLayout contentView = new FrameLayout()
            {
                Gravity = Gravity.Center,
                Width = Application.GetRealWidth(270),
                Height = Application.GetRealHeight(140),
                BackgroundColor = CSS_Color.MainBackgroundColor,
                BorderColor = 0x00000000,
                BorderWidth = 0,
                Radius = (uint)Application.GetMinRealAverage(10),
            };
            dialog.AddChidren(contentView);
            Button btnTitle = new Button()
            {
                Y = Application.GetRealHeight(16),
                Height = Application.GetRealHeight(30),
                TextColor = CSS_Color.MainColor,
                TextSize = CSS_FontSize.SubheadingFontSize,
                TextAlignment = TextAlignment.Center,
                IsBold = true,
                TextID = titleId,
            };
            contentView.AddChidren(btnTitle);
            Button btnMsg = new Button()
            {
                Gravity = Gravity.CenterHorizontal,
                Height = Application.GetRealHeight(25),
                Y = btnTitle.Bottom,
                Width = Application.GetRealHeight(200),
                TextAlignment = TextAlignment.Center,
                TextColor = CSS_Color.TextualColor,
                TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
                TextID = msgId,
            };
            contentView.AddChidren(btnMsg);
            Button btnLine = new Button()
            {
                Y = Application.GetRealHeight(96),
                Height = Application.GetRealHeight(1),
                Width = Application.GetRealWidth(270 / 2),
                BackgroundColor = CSS_Color.DividingLineColor,
            };
            contentView.AddChidren(btnLine);
            Button btnCancel = new Button()
            {
                Y = btnLine.Bottom,
                Width = Application.GetRealWidth(135),
                Height = Application.GetRealHeight(43),
                TextAlignment = TextAlignment.Center,
                TextColor = CSS_Color.TextualColor,
                TextSize = CSS_FontSize.SubheadingFontSize,
                TextID = cancelID,
            };
            contentView.AddChidren(btnCancel);
            Button btnConfirm = new Button()
            {
                X = btnCancel.Right,
                Y = btnLine.Y,
                Width = Application.GetRealWidth(135),
                Height = Application.GetRealHeight(45),
                TextAlignment = TextAlignment.Center,
                //TextColor = CSS_Color.TextualColor,
                TextSize = CSS_FontSize.SubheadingFontSize,
                TextColor = CSS_Color.MainBackgroundColor,
                BackgroundColor = CSS_Color.MainColor,
                TextID = confirmID,
            };
            contentView.AddChidren(btnConfirm);
            //例:右下圆角 大小为50
            int mRectCornerID = HDLUtils.RectCornerBottomRight;
            btnConfirm.SetCornerWithSameRadius((uint)Application.GetMinRealAverage(10), mRectCornerID);
            dialog.Show();
            btnCancel.MouseUpEventHandler += (sender, e) =>
            {
                dialog.Close();
                cancelAction?.Invoke();
            };
            btnConfirm.MouseUpEventHandler += (sender, e) =>
            {
                dialog.Close();
                okAction?.Invoke();
            };
        }
        /// <summary>
        /// 加载提示Dialog
        /// </summary>
        /// <param name="titleId"></param>
        /// <param name="msgId"></param>
        /// <param name="callBackAction"></param>
        public void ShowConfirmDialog(int titleId, int msgId, Action okAction, Action cancelAction = null)
        {
            ShowConfirmDialogBase(titleId, msgId, okAction, cancelAction);
        }
        /// <summary>
        /// 加载提示Dialog
        /// 可以自定义按钮文字
        /// </summary>
        /// <param name="titleId"></param>
        /// <param name="msgId"></param>
        /// <param name="okAction"></param>
        /// <param name="cancelAction"></param>
        /// <param name="cancelID"></param>
        /// <param name="confirmID"></param>
        public void ShowConfirmDialog(int titleId, int msgId, Action okAction, Action cancelAction, int cancelID, int confirmID)
        {
            ShowConfirmDialogBase(titleId, msgId, okAction, cancelAction, cancelID, confirmID);
        }
        #endregion
        #region 检测更新
        /// <summary>
        /// 检测更新线程
        /// </summary>
        public void CheckIfNeedForceUpdate()
        {
            System.Threading.Tasks.Task.Run(() =>
            {
                try
                {
                    var revertObj = new HttpServerRequest().CheckAppVersion();
                    if (revertObj.Code == StateCode.SUCCESS)
                    {
                        if (revertObj.Data != null)
                        {
                            var appVersionRes = Newtonsoft.Json.JsonConvert.DeserializeObject<AppVersionRes>(revertObj.Data.ToString());
                            if (appVersionRes != null)
                            {
                                var mForceUpdateInfo = new UpdateDialogInfo()
                                {
                                    UpdateType = appVersionRes.isEnforce ? 2 : 1,
                                    NewVersion = appVersionRes.version,
                                    NewVersionUrl = appVersionRes.androidUrl
                                };
#if __IOS__
                                mForceUpdateInfo.NewVersionUrl = appVersionRes.iosUrl;
#endif
                                //解析更新内容详情
                                var reasonStrJson = GetReasonStrJson(appVersionRes.updateDescription);
                                if (reasonStrJson != null)
                                {
                                    if (Language.CurrentLanguage == "Chinese")
                                    {
                                        mForceUpdateInfo.ReasonStr = reasonStrJson.Chinese;
                                    }
                                    else
                                    {
                                        mForceUpdateInfo.ReasonStr = reasonStrJson.English;
                                    }
                                }
                                Application.RunOnMainThread(() =>
                                {
                                    ShowForceUpdateDialog(mForceUpdateInfo);
                                });
                            }
                        }
                    }
                    else
                    {
                        Utlis.WriteLine("请求失败");
                    }
                }
                catch (Exception ex)
                {
                    //Shared.Utlis.WriteLine (ex.ToString ());
                }
                finally
                {
                }
            });
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="jsonStr"></param>
        /// <returns></returns>
        public ReasonStrJson GetReasonStrJson(string jsonStr)
        {
            try
            {
                if (!string.IsNullOrEmpty(jsonStr))
                {
                    return Newtonsoft.Json.JsonConvert.DeserializeObject<ReasonStrJson>(jsonStr);
                }
                return null;
            }
            catch
            {
                return null;
            }
        }
        /// <summary>
        /// 提示强制更新Dialog
        /// 点击确认跳转浏览器
        /// </summary>
        public void ShowForceUpdateDialog(UpdateDialogInfo mUpdateDialogInfo)
        {
            // 1.1 没有更新 返回
            if (mUpdateDialogInfo.UpdateType == 0) return;
            // 1.2 有新版本但是忽略过 返回
            if (mUpdateDialogInfo.UpdateType == 1 && (UserInfo.Current.IgnoreUpdateVersion == mUpdateDialogInfo.NewVersion)) return;
            // 2.1 有新版本没有忽略过 提示更新
            if (mUpdateDialogInfo.UpdateType == 1)
            {
                Action okAction = () =>
                {
                    if (string.IsNullOrEmpty(mUpdateDialogInfo.NewVersionUrl)) return;
                    HDLUtils.OpenUrl(mUpdateDialogInfo.NewVersionUrl);
                };
                Action cancelAction = () =>
                {
                    UserInfo.Current.IgnoreUpdateVersion = mUpdateDialogInfo.NewVersion;
                    UserInfo.Current.SaveUserInfo();
                };
                //1提示更新
                var dialog = new UpdateTipDialog();
                var tipStr = Language.StringByID(StringId.VersionNumber) + mUpdateDialogInfo.NewVersion;
                dialog.ShowUpdateDialog(Language.StringByID(StringId.DiscoverNewVersion), tipStr, mUpdateDialogInfo.ReasonStr, okAction, cancelAction);
            }
            else if (mUpdateDialogInfo.UpdateType == 2) //2.2 需要强制更新
            {
                //2强制更新
                //"1.发现新版本App,当前版本已停用,马上更新!\n2.请下载和安装新版本!....."
                Action okAction = () =>
                {
                    if (string.IsNullOrEmpty(mUpdateDialogInfo.NewVersionUrl))
                    {
                        Utlis.ShowTip(Language.StringByID(StringId.DataExceptionPleaseTryAgain));
                        return;
                    };
                    HDLUtils.OpenUrl(mUpdateDialogInfo.NewVersionUrl);
                };
                //1提示更新
                var dialog = new UpdateTipDialog();
                var tipStr = Language.StringByID(StringId.VersionNumber) + mUpdateDialogInfo.NewVersion;
                dialog.ShowForcedUpdateDialog(Language.StringByID(StringId.DiscoverNewVersion), tipStr, mUpdateDialogInfo.ReasonStr, okAction);
            }
            else //3. 只需提示
            {
                //3提示通知
                Action okAction = () =>
                {
                };
                var dialog = new UpdateTipDialog();
                dialog.ShowTipDialog(Language.StringByID(StringId.Tip), mUpdateDialogInfo.ReasonStr, okAction);
            }
        }
        #endregion
        /// <summary>
        /// 恢复住宅
        /// 2020-12-03 待测试未检测
        /// </summary>
        public void RestoreHomeBackup(string RegionID)
        {
            var isExist = FileUtils.ExistRegion(RegionID);
            if (isExist)
            {
                //存在则恢复
                string newRegionRootPath = FileUtils.CreateRegionBackup(RegionID);
                FileUtils.RestoreRegionFiles(newRegionRootPath);
            }
        }
        #region 推送处理
        /// <summary>
        /// 推送消息处理
        /// </summary>
        /// <param name="jpushMessageInfo"></param>
        public void AdjustPushMessage(JPushMessageInfo jpushMessageInfo)
        {
            try
            {
                if (jpushMessageInfo.Extras != null && jpushMessageInfo.Extras.Contains("OffLine"))
                {
                    Shared.Application.RunOnMainThread(() =>
                    {
                        //账号在别处登陆,被踢下线 跳转到登录页面
                        new Alert(Language.StringByID(StringId.Tip), Language.StringByID(StringId.LoggedOnOtherDevices), Language.StringByID(StringId.Close)).Show();
                        //退出登录操作
                        CheckLogout();
                    });
                    return;
                }
                else
                {
                    Shared.Application.RunOnMainThread(() =>
                    {
                        new Alert(jpushMessageInfo.Title, jpushMessageInfo.Content, Language.StringByID(StringId.Close)).Show();
                    });
                    return;
                }
            }
            catch
            {
            }
        }
        /// <summary>
        /// 退出登录操作
        /// </summary>
        public void CheckLogout()
        {
#if DEBUG
            return;
#endif
            //未登录不用处理
            if (!UserInfo.Current.IsLogin) return;
            Logout();
        }
        /// <summary>
        /// 退出登录操作
        /// </summary>
        public void Logout()
        {
            new System.Threading.Thread(() =>
            {
                try
                {
                    #region 保存本地数据至文件夹
                    string oldRegionRootPath = FileUtils.CreateRegionBackup(DB_ResidenceData.residenceData.CurReginID.ToString());
                    //清空之前的住宅文件
                    FileUtils.DeleteRegionFiles(oldRegionRootPath);
                    var backuplist = FileUtils.ReadFiles();
                    //移动文件
                    foreach (var fileName in backuplist)
                    {
                        System.IO.FileInfo fileInfo = new System.IO.FileInfo(FileUtils.RootPath + fileName);
                        if (fileInfo.Exists)
                        {
                            fileInfo.MoveTo(oldRegionRootPath + fileName);
                            MainPage.Log("move file : " + fileName);
                        }
                    }
                    #endregion
                }
                catch (Exception ex)
                {
                    MainPage.Log($"xxx:{ex.Message}");
                }
                finally
                {
                    FileUtils.DeleteAllFile();
                    //2.注销推送
                    new HttpServerRequest().SignOutPush();
                    //3.跳转登录页面
                    UserInfo.Current.LastTime = DateTime.MinValue;
                    UserInfo.Current.headImagePagePath = "LoginIcon/2.png";//重置用户头像
                    UserInfo.Current.SaveUserInfo();
                    Shared.Application.RunOnMainThread(() =>
                    {
                        MainPage.GoLoginPage(UserInfo.Current);
                        DB_ResidenceData.residenceData.EixtAccount();
                    });
                }
            }).Start();
        }
        #endregion
    }
}