JLChen
2020-12-23 320d7cc8feb394d0ce3db2ec1d01593b554d990f
HDL_ON/Common/HDLCommon.cs
@@ -4,6 +4,9 @@
using HDL_ON.UI.CSS;
using HDL_ON.DAL.Server;
using HDL_ON.UI;
using HDL_ON.Entity;
using System.Threading;
using HDL_ON.DriverLayer;
namespace HDL_ON
{
@@ -13,6 +16,11 @@
    /// </summary>
    public class HDLCommon
    {
        /// <summary>
        /// 收到推送Action事件
        /// </summary>
        public static Action GetPushMessageAction;
        #region ■ 变量声明___________________________
        /// <summary>
        /// 通用方法
@@ -68,7 +76,7 @@
        #endregion
        #region 检测更新
        #region ■ 检测更新_______________________
        /// <summary>
        /// 检测更新线程
        /// </summary>
@@ -78,24 +86,43 @@
            {
                try
                {
                    var requestObj = new ForceUpdateObj()
                    {
                        LanguageType = Utlis.GetPostLanguageType()
                    };
#if __IOS__
                    requestObj.DeviceType = PhoneDeviceType.IOS.ToString();
#endif
                    var requestJson = Newtonsoft.Json.JsonConvert.SerializeObject(requestObj);
                    var revertObj = HttpUtil.RequestHttpsPost(NewAPI.API_POST_CheckAppVersion, requestJson);
                    var revertObj = new HttpServerRequest().CheckAppVersion();
                    if (revertObj.Code == StateCode.SUCCESS)
                    {
                        var mForceUpdateInfo = Newtonsoft.Json.JsonConvert.DeserializeObject<ForceUpdateInfo>(revertObj.Data.ToString());
                        if (mForceUpdateInfo != null)
                        if (revertObj.Data != null)
                        {
                            Application.RunOnMainThread(() =>
                            var appVersionRes = Newtonsoft.Json.JsonConvert.DeserializeObject<AppVersionRes>(revertObj.Data.ToString());
                            if (appVersionRes != null)
                            {
                                ShowForceUpdateDialog(mForceUpdateInfo);
                            });
                                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
@@ -117,68 +144,342 @@
        }
        /// <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(ForceUpdateInfo mForceUpdateInfo)
        public void ShowForceUpdateDialog(UpdateDialogInfo mUpdateDialogInfo)
        {
            // 1.1 没有更新 返回
            if (mForceUpdateInfo.UpdateType == 0) return;
            if (mUpdateDialogInfo.UpdateType == 0) return;
            // 1.2 有新版本但是忽略过 返回
            if (mForceUpdateInfo.UpdateType == 1 && (UserInfo.Current.IgnoreUpdateVersion == mForceUpdateInfo.NewVersion)) return;
            if (mUpdateDialogInfo.UpdateType == 1 && (OnAppConfig.Instance.IgnoreUpdateVersion == mUpdateDialogInfo.NewVersion)) return;
            // 2.1 有新版本没有忽略过 提示更新
            if (mForceUpdateInfo.UpdateType == 1)
            if (mUpdateDialogInfo.UpdateType == 1)
            {
                Action okAction = () =>
                {
                    if (string.IsNullOrEmpty(mForceUpdateInfo.NewVersionUrl)) return;
                    if (string.IsNullOrEmpty(mUpdateDialogInfo.NewVersionUrl)) return;
                    HDLUtils.OpenUrl(mForceUpdateInfo.NewVersionUrl);
                    HDLUtils.OpenUrl(mUpdateDialogInfo.NewVersionUrl);
                };
                Action cancelAction = () =>
                {
                    //UserInfo.Current.IgnoreUpdateVersion = mForceUpdateInfo.NewVersion;
                    //UserInfo.Current.SaveUserInfo();
                    OnAppConfig.Instance.IgnoreUpdateVersion = mUpdateDialogInfo.NewVersion;
                    OnAppConfig.Instance.SaveConfig();
                };
                //1提示更新
                var dialog =  new UpdateTipDialog();
                var tipStr = Language.StringByID(StringId.VersionNumber) + mForceUpdateInfo.NewVersion;
                dialog.ShowUpdateDialog(Language.StringByID(StringId.DiscoverNewVersion), tipStr, mForceUpdateInfo.ReasonStr, okAction, cancelAction);
                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 (mForceUpdateInfo.UpdateType == 2) //2.2 需要强制更新
            else if (mUpdateDialogInfo.UpdateType == 2) //2.2 需要强制更新
            {
                //2强制更新
                //"1.发现新版本App,当前版本已停用,马上更新!\n2.请下载和安装新版本!....."
                Action okAction = () =>
                {
                    if (string.IsNullOrEmpty(mForceUpdateInfo.NewVersionUrl)) {
                    if (string.IsNullOrEmpty(mUpdateDialogInfo.NewVersionUrl))
                    {
                        Utlis.ShowTip(Language.StringByID(StringId.DataExceptionPleaseTryAgain));
                        return;
                    };
                    HDLUtils.OpenUrl(mForceUpdateInfo.NewVersionUrl);
                    HDLUtils.OpenUrl(mUpdateDialogInfo.NewVersionUrl);
                };
                //1提示更新
                var dialog = new UpdateTipDialog();
                var tipStr = Language.StringByID(StringId.VersionNumber) + mForceUpdateInfo.NewVersion;
                dialog.ShowForcedUpdateDialog(Language.StringByID(StringId.DiscoverNewVersion), tipStr, mForceUpdateInfo.ReasonStr, okAction);
                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), mForceUpdateInfo.ReasonStr, okAction);
                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(() =>
                    {
                        GetPushMessageAction?.Invoke();
                        //报警推送才弹窗提示(messageType包含Alarm关键字的)
                        if (jpushMessageInfo.messageType != null && jpushMessageInfo.messageType.Contains("Alarm"))
                        {
                            //报警推送弹窗提示
                            ShowAlarmPushMessage(jpushMessageInfo);
                            //new Alert(jpushMessageInfo.Title, jpushMessageInfo.Content, Language.StringByID(StringId.Close)).Show();
                        }
                    });
                    return;
                }
            }
            catch
            {
            }
        }
        /// <summary>
        /// 账号在别处登陆,被踢下线 跳转到登录页面
        /// 要在主线程调用
        /// 退出登录操作
        /// </summary>
        public void CheckLogout()
        {
            //未登录不用处理
            if (!UserInfo.Current.IsLogin) return;
            //账号在别处登陆,被踢下线 跳转到登录页面
            new Alert(Language.StringByID(StringId.Tip), Language.StringByID(StringId.LoggedOnOtherDevices), Language.StringByID(StringId.Close)).Show();
#if DEBUG
            return;
#endif
            Logout();
        }
        /// <summary>
        /// 退出登录操作
        /// </summary>
        public void Logout()
        {
            //加载Loading效果
            var waitPage = new Loading();
            MainPage.BaseView.AddChidren(waitPage);
            waitPage.Start(Language.StringByID(StringId.PleaseWait));
            new Thread(() =>
            {
                try
                {
                    //2.注销推送
                    new HttpServerRequest().SignOutPush();
                    //3.跳转登录页面
                    UserInfo.Current.LastTime = DateTime.MinValue;
                    UserInfo.Current.SaveUserInfo();
                    DB_ResidenceData.Instance.EixtAccount();
                }
                catch (Exception ex)
                {
                    MainPage.Log($"xxx:{ex.Message}");
                }
                finally
                {
                    Application.RunOnMainThread(() =>
                    {
                        if (waitPage != null)
                        {
                            waitPage.RemoveFromParent();
                            waitPage = null;
                        }
                        MainPage.GoLoginPage(UserInfo.Current);
                    });
                }
            }).Start();
        }
        /// <summary>
        ///
        /// </summary>
        ConfirmDialog alarmPushConfirmDialog;
        /// <summary>
        /// 报警推送弹窗提示,点击查看跳转信息中心
        /// </summary>
        /// <param name="jpushMessageInfo"></param>
        public void ShowAlarmPushMessage(JPushMessageInfo jpushMessageInfo)
        {
            //没登录不处理
            if (UserInfo.Current == null || !UserInfo.Current.IsLogin || MainPage.BasePageView == null)
            {
                return;
            }
            //跳转信息中心页面
            Action goAction = () =>
            {
                //Dialog
                alarmPushConfirmDialog = null;
                Action backAction = () => {
                };
                var skipPage = new MessageCenterPage();
                MainPage.BasePageView.AddChidren(skipPage);
                skipPage.LoadPage(backAction);
                MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
            };
            //取消事件
            Action cancelAction = () =>
            {
                alarmPushConfirmDialog = null;
            };
            //防止多次弹窗处理
            if (alarmPushConfirmDialog == null)
            {
                alarmPushConfirmDialog = new ConfirmDialog();
                alarmPushConfirmDialog.ShowDialog(Language.StringByID(StringId.Tip), jpushMessageInfo.Content, goAction, cancelAction, StringId.Cancel, StringId.LookOver);
            }
            else
            {
                alarmPushConfirmDialog.RefreshDialog(Language.StringByID(StringId.Tip), jpushMessageInfo.Content, goAction, cancelAction, StringId.Cancel, StringId.LookOver);
            }
        }
        #endregion
        #region ■ 常用方法_______________________
        /// <summary>
        /// 设置下划线按钮状态
        /// 统一封装设置方法
        /// </summary>
        /// <param name="button">下划线按钮</param>
        /// <param name="bottomLineType">状态</param>
        public void BottomLineShowType(Button button, BottomLineType bottomLineType)
        {
            switch (bottomLineType)
            {
                case BottomLineType.GotFocus:
                    button.BackgroundColor = CSS_Color.MainColor;
                    button.Height = Application.GetRealHeight(2);
                    break;
                case BottomLineType.Error:
                    button.BackgroundColor = CSS_Color.AuxiliaryColor2;
                    button.Height = Application.GetRealHeight(2);
                    break;
                case BottomLineType.Normal:
                    button.BackgroundColor = CSS_Color.DividingLineColor;
                    button.Height = Application.GetRealHeight(1);
                    break;
                default:
                    button.BackgroundColor = CSS_Color.DividingLineColor;
                    button.Height = Application.GetRealHeight(1);
                    break;
            }
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="userName"></param>
        /// <returns></returns>
        public string GetUserName(string userName)
        {
            return string.IsNullOrEmpty(userName) ? Language.StringByID(StringId.UsersWhoNameIsEmpty) : userName;
        }
        /// <summary>
        /// 监听网络变化后处理事件
        /// 刷新网络状态
        /// </summary>
        /// <param name="internetStatus">网络变化</param>
        /// <param name="IsEnterBackground">是否进入了后台</param>
        public void UpdateInternetStatus(int internetStatus, bool IsEnterBackground = false)
        {
            MainPage.Log($"网络状态变化,当前网络:{internetStatus} 是否后台:{IsEnterBackground.ToString()}");
            //网络状态变化 重置网关状态重新搜索
            Control.Ins.GatewayOnline = false;
            //网络变化,断开重连一次
            if (Control.Ins.IsRemote)
            {
                Control.Ins.IsRemote = false;
                DAL.Mqtt.MqttClient.DisConnectRemote("UpdateInternetStatus", false);
            }
            if (internetStatus == 0)//没有网络连接 0
            {
                Control.Ins.GatewayOnline = false;
                Control.Ins.IsRemote = false;
                MainPage.InternetStatus = 0;
            }
            else if (internetStatus == 1)//3,4G的网络连接 1
            {
                MainPage.InternetStatus = 1;
                Control.Ins.SearchLoaclGateway();
            }
            else if (internetStatus == 2)//WiFi网络
            {
                MainPage.InternetStatus = 2;
                Control.Ins.SearchLoaclGateway();
            }
        }
        #endregion
    }
}