*****一句话总结:该类提供了对所有的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
}