UIManager.cs

*****一句话总结:该类提供了对所有的INotify、INavigate对象及同步中心的相关操作

 

 

一、截图

  

    整体来看:

分开看

   1.同步中心

2.INotify

3.INavigate

 

 

 

二、详细代码:

    /// <summary>
    /// Controller和INotify交互的桥梁
    /// 公开属性 尽量不用
    /// 而是在该类内部建立相应的方法,调用私有的全局变量
    /// 
    /// 
    /// ***发散式变化,违反单一职责:适时提取类 并委派任务***
    /// </summary>    
    public sealed class UIManager
    {
        private PanelSyncCenter mPanelSyncCenter;

        private List<INotify> mINotifys;

        private List<INotify> INotifys
        {
            get
            {
                return this.mINotifys;
            }
        }


        private Dictionary<string, NavigatePanel> mNavigatePanelDic;


        public UIManager()
        {
            this.mINotifys = new List<INotify>();
            this.mNavigatePanelDic = new Dictionary<string, NavigatePanel>();
        }


        #region PanelSyncCenter

        /// <summary>
        /// 设置PanelSyncCenter
        /// </summary>
        /// <param name="pageSyncCenter"></param>
        public void SetPanelSyncCenter(PanelSyncCenter pageSyncCenter)
        {
            this.mPanelSyncCenter = pageSyncCenter;
        }

        /// <summary>
        /// 添加备份任务
        /// </summary>
        /// <param name="task"></param>
        public void AddTaskProgressControl(SyncTaskData task)
        {
            if (this.mPanelSyncCenter != null)
                this.mPanelSyncCenter.AddTask(task);
        }

        /// <summary>
        /// 清空所有的进度条
        /// </summary>
        public void ClearProgressContorl()
        {
            if (this.mPanelSyncCenter != null)
                this.mPanelSyncCenter.ClearProgressContorl();
        }

        #endregion


        #region INotify

        public void AddINotify(INotify iNotify)
        {
            if (iNotify == null)
                throw new ArgumentNullException("iNotify");

            this.INotifys.Add(iNotify);
        }

        /// <summary>
        /// 该函数用来通知百分比
        /// </summary>
        /// <param name="notify"></param>
        /// <param name="oneKeyTaskTotalCount"></param>
        /// <param name="oneKeyTaskFinishedCount"></param>
        public void NotifyStep(SyncNotifyData notify, int oneKeyTaskTotalCount, int oneKeyTaskFinishedCount)
        {
            if (notify == null || this.mPanelSyncCenter == null)
                return;

            if (!CanNotifyToUI(notify))
                return;

            if (notify.IsCalculate)
            {
                notify.Percent = this.CalCulatePercent(notify, oneKeyTaskTotalCount, oneKeyTaskFinishedCount);
                notify.Msg = this.BuilderMsg(notify);
            }

            new AsyncTools().CallBack<SyncNotifyData>(this.mPanelSyncCenter, notify, (target) =>
            {
                INotify iNotify = this.mPanelSyncCenter.GetNotify(target);
                if (iNotify == null)
                    return;

                iNotify.NotifyStep(target);
            });
        }

        /// <summary>
        /// 是否可以通知到UI界面
        /// Return: true 可以, false 则不可以
        /// </summary>
        /// <param name="notify"></param>
        /// <returns></returns>
        private static bool CanNotifyToUI(SyncNotifyData notify)
        {
            if (notify.Task == null)
                return true;

            return string.Compare(notify.Task.IMEI, SingleData.Instance.IMEI, true) == 0;
        }

        /// <summary>
        /// 通知Android设备已断开连接
        /// </summary>
        public void BroadcastDisconnected()
        {
            AsyncTools async = new AsyncTools();

            this.INotifys.ForEach((n) =>
            {
                async.CallBack<INotify>(n.UIControl, n, (INotify args) =>
                {
                    args.NotifyDisconnected();
                });
            });
        }

        /// <summary>
        /// 通知有android设备接入
        /// </summary>
        /// <param name="deviceIsChange"></param>
        public void BroadcastConnected(bool deviceIsChange)
        {
            AsyncTools async = new AsyncTools();

            this.INotifys.ForEach((n) =>
            {
                async.CallBack<INotify>(n.UIControl, n, (INotify args) =>
                {
                    args.NotifyConnected(deviceIsChange);
                });
            });
        }

        #region PrivateNotifyStep

        /// <summary>
        /// 生成提示信息
        /// </summary>
        /// <param name="notify"></param>
        /// <returns></returns>
        private string BuilderMsg(SyncNotifyData notify)
        {
            string obj = this.GetSyncObject(notify.Task);
            string type = (((int)notify.Task.SyncType % 2) == 0) ? "恢复" : "备份";
            switch (notify.Step)
            {
                case ENotifyStep.Start:
                    return string.Format("开始{1}{0}", obj, type);

                case ENotifyStep.GetPhoneData:
                    return string.Format("{1}{0}:获取{1}数据", obj, type);

                case ENotifyStep.CompareData:
                    return string.Format("{1}{0}:对比数据", obj, type);

                case ENotifyStep.SyncData:
                    return string.Format("{4}{0}:正在{4}{1}({2}/{3})", obj, notify.Msg, notify.Finished, notify.Total, type);

                case ENotifyStep.CheckConfig:
                    return string.Format("{0}{1}:正在校验数据", type, obj);

                case ENotifyStep.OverOne:
                    return string.Format("{2}{0}:{1}", obj, notify.Msg, type);

                default:
                    return string.Empty;
            }
        }


        private string GetSyncObject(SyncTaskData task)
        {
            switch (task.SyncType)
            {
                case ESyncType.BackupSystem:
                case ESyncType.RestoreSystem:
                    return "系统配置";

                case ESyncType.BackupAPK:
                case ESyncType.RestoreAPK:
                    return "安装包";

                case ESyncType.BackupPic:
                case ESyncType.RestorePic:
                    return "照片";

                case ESyncType.BackupMp3:
                case ESyncType.RestoreMp3:
                    return "音乐";

                default:
                    return string.Empty;
            }
        }

        /// <summary>
        /// 计算备份百分比
        /// </summary>
        /// <param name="notify"></param>
        /// <returns></returns>
        private double CalCulatePercent(SyncNotifyData notify, int total, int finished)
        {
            return this.CalculateOneTask(notify);
        }

        /// <summary>
        /// 计算 一键备份 百分比
        /// </summary>
        /// <param name="notify"></param>
        /// <param name="percent">单项任务备份百分比</param>
        /// <returns></returns>
        private double CalculateOneKey(SyncNotifyData notify, double percent, int total, int finished)
        {
            if (percent == 100)
            {
                finished++;
                return finished * 1.0 / total * 100;
            }

            return (finished * 1.0 / total * 100) + (percent / total);
        }

        /// <summary>
        /// 计算 单项任务备份 百分比
        /// </summary>
        /// <param name="notify"></param>
        /// <returns></returns>
        private double CalculateOneTask(SyncNotifyData notify)
        {
            switch (notify.Step)
            {
                // 开始备份
                case ENotifyStep.Start:
                    return 5;

                // 获取备份数据
                case ENotifyStep.GetPhoneData:
                    return 10;

                // 对比数据
                case ENotifyStep.CompareData:
                    return 25;

                // 正在备份数据
                case ENotifyStep.SyncData:
                    return 30 + (notify.Finished * 1.0 / notify.Total) * 65;

                // 校验配置文件
                case ENotifyStep.CheckConfig:
                    return 95;

                // 完成单一任务
                case ENotifyStep.OverOne:
                    return 100;

                default:
                    return 0;
            }
        }

        #endregion

        #endregion


        #region NavigatePanel

        /// <summary>
        /// 增加一个Navigate对象
        /// </summary>
        /// <param name="name"></param>
        /// <param name="panel"></param>
        public void AddNavigatePanel(string name, NavigatePanel panel)
        {
            if (this.mNavigatePanelDic.ContainsKey(name))
                return;

            this.mNavigatePanelDic.Add(name, panel);
        }

        /// <summary>
        /// 导航,即所有的跳转都通过它来跳    [导航时一定会触发BeginShow]
        /// </summary>
        /// <param name="panelName"></param>
        /// <param name="nextControl"></param>
        public void Navigate(string panelName, string nextControl, bool checkKey = false)
        {
            if (!this.mNavigatePanelDic.ContainsKey(panelName))
                throw new ArgumentException("panelName is not exist ");

            if (checkKey && string.Compare(this.mNavigatePanelDic[panelName].CurrentKey, nextControl, true) == 0)
                return;

            this.mNavigatePanelDic[panelName].Navigate(nextControl);
        }

        #endregion

    }


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值