using System;
using System.IO;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine;
using ResUpdate;
namespace GameLogic
{
///
/// 热更新面板
///
public class UpdatePanel : MonoBehaviour
{
///
/// 提示文字
///
[SerializeField]
Text tipsText;
///
/// 进度条
///
[SerializeField]
SliderCtrl slider;
[SerializeField]
UpdateMsgBox msgBox;
//> 资源配置文件拉取失败自动重试次数
int autoRetryTimes = 0;
int WaitTime=0;
void Awake()
{
Transform channelBgTrabsfrom = transform.Find("Canvas/LoadingScreen/" + AppConst.ChannelType);
if (channelBgTrabsfrom != null)
{
channelBgTrabsfrom.gameObject.SetActive(true);
}
autoRetryTimes = 0;
msgBox.gameObject.SetActive(false);
//StartCoroutine(GetGameConfig());
// BeginUpdatePlatform();
StartCoroutine(AwakeUpdatePlatform());
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.Escape))
{
//> msgBox.Show("取消", "确定", "确定关闭程序?", (result) =>
msgBox.Show(SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.CANEL), SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.CONFIRM), SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.CONFIRM_CLOSE), (result) =>
{
if (result == 1)
Application.Quit();
});
}
}
// void Start()
// {
//#if UNITY_EDITOR
//#elif UNITY_ANDROID
// Debug.LogError("UpdatePanel HideSplash Init SDKManager::::");
// using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
// {
// using (AndroidJavaObject jo = jc.GetStatic("currentActivity"))
// {
// jo.Call("HideSplash");
// }
// }
//#elif UNITY_IPHONE || UNITY_IOS
//#endif
// }
IEnumerator AwakeUpdatePlatform()
{
if(PlayerPrefs.GetInt("gameStart")==2)
{
BeginUpdatePlatform();
}
else
{
yield return new WaitForSeconds(1);
if(WaitTime>10)
{
msgBox.Show(SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.CONFIRM), SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.INIT_FAILED), (result) =>
{
Application.Quit();
});
}
else
{
WaitTime=WaitTime+1;
StartCoroutine(AwakeUpdatePlatform());
}
}
}
IEnumerator GetGameConfig()
{
//> tipsText.text = "获取游戏配置";
tipsText.text = SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.GET_GAME_SETTINGS);
var jsonData = UpdateManager.Instance.PostServerInfo();
WWW www = new WWW(AppConst.Download_apk_Url, Encoding.UTF8.GetBytes(jsonData));
yield return www;
if (string.IsNullOrEmpty(www.error))
{
OnGetGameConfig(www.text);
}
else
{
Debug.LogError(www.url+" "+www.error);
//> msgBox.Show("重试", "获取游戏配置失败!", (result) =>
msgBox.Show(SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.RETRY), SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.GET_GAME_SETTINGS_FAILED), (result) =>
{
StartCoroutine(GetGameConfig());
});
}
www.Dispose();
}
bool CheckAndConvert(Hashtable tab,string parameterName,object targetValue)
{
if(tab.Contains(parameterName))
{
var parStr= tab[parameterName] as string;
if(typeof(T) ==typeof(int))
{
int intValue=0;
if (int.TryParse(parStr, out intValue))
{
targetValue= intValue;
return true;
}
}
else if(typeof(T) ==typeof(bool))
{
if (parStr.ToLower() == "true" || parStr=="1")
{
targetValue = true;
}
}
else if (typeof(T) == typeof(string))
{
if (parStr!=null)
{
targetValue = parStr;
return true;
}
}
}
return false;
}
void OnGetGameConfig(string config)
{
if (string.IsNullOrEmpty(config))
{
return;
}
Util.LogError("gameConfig::"+config);
var data = MiniJSON.jsonDecode(config) as Hashtable;
if(data==null || data.Contains("error"))
{
//> msgBox.Show("重试", "获取游戏配置错误!", (result) =>
msgBox.Show(SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.RETRY), SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.GET_GAME_SETTINGS_ERROR), (result) =>
{
StartCoroutine(GetGameConfig());
});
return;
}
if (AppConst.isUpdate)
{
BeginUpdateGame();
}
else
{
OnUpdateFinish();
}
}
///
/// 更新游戏
///
void BeginUpdateGame()
{
GameUpdateManager.Instance.BeginUpdate(OnGameUpdateStateChanged);
}
///
/// 更新平台
///
void BeginUpdatePlatform()
{
UpdateManager.Instance.UpdateResources(OnResourcesUpdateStateChanged);
}
///
/// 游戏状态改变
///
///
///
///
void OnGameUpdateStateChanged(bool isFinish, GameUpdateState state, object param)
{
//Debug.LogFormat("OnGameUpdateStateChanged=======>IsFinish:{0},State:{1}", isFinish, state.ToString());
switch (state)
{
case GameUpdateState.DownLoadGameConfigs:
//> tipsText.text = "获取版本信息";
tipsText.text = SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.GET_VERSION_INFO);
break;
case GameUpdateState.DownLoadGameConfigsFailed:
//> msgBox.Show("重试", "获取游戏配置失败,请确认网络后重试!", (result) =>
msgBox.Show(SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.RETRY), SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.GET_GAME_SETTINGS_FAILED_CONFIRM_WIFI), (result) =>
{
BeginUpdateGame();
});
break;
case GameUpdateState.NeedUpdateApp:
// msgBox.Show();
GameUpdateManager.Instance.UpdateApp();
break;
case GameUpdateState.DownLoadAPKProgress:
OnGameUpdateProgress(param as DownLoadProgress);
break;
case GameUpdateState.DownLoadAPKFailed:
//> msgBox.Show("重试", "下载安装文件失败,请确认网络后重试!", (result) =>
msgBox.Show(SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.RETRY), SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.DOWNlOAD_FILE_FAILED_CONFIRM_WIFI), (result) =>
{
GameUpdateManager.Instance.UpdateAPK(true);
});
break;
case GameUpdateState.Success:
BeginUpdatePlatform();
break;
}
}
///
/// 资源更新状态改变
///
///
///
///
void OnResourcesUpdateStateChanged(bool isFinish, ResourcesUpdateState state, object param)
{
//Debug.LogFormat("OnResourcesUpdateStateChanged=======>IsFinish:{0},State:{1}", isFinish, state.ToString());
switch (state)
{
case ResourcesUpdateState.GetGameConfigs:
//> tipsText.text = "获取资源配置";
tipsText.text = SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.GET_RESOURCES_SETTINGS);
break;
case ResourcesUpdateState.GetGameConfigsFailed:
//> msgBox.Show("重试", "获取资源版本失败,请确认网络后重试!", (result) =>
msgBox.Show(SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.RETRY), SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.GET_RESOURCES_VERSION_FAILED_CONFIRM_WIFI), (result) =>
{
BeginUpdatePlatform();
});
break;
case ResourcesUpdateState.DownLoadVersionFiles:
//> tipsText.text = "校验资源文件";
tipsText.text = SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.CHECK_RESOURCES_FILE);
break;
case ResourcesUpdateState.DownLoadVersionFilesFailed:
//> msgBox.Show("重试", "获取资源配置失败,请确认网络后重试!", (result) =>
if(autoRetryTimes < 3)
{
autoRetryTimes++;
BeginUpdatePlatform();
break;
}
msgBox.Show(SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.RETRY), SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.GET_RESOURCES_SETTINGS_FAILED_CONFIRM_WIFI), (result) =>
{
BeginUpdatePlatform();
});
break;
case ResourcesUpdateState.DownLoadFromNoWifi:
float size = 1f * (long)(param as object[])[0] / 1024 / 1024;
Action startDownAction = (param as object[])[1] as Action;
//> string msg = string.Format("检测到资源更新{0:f2}MB,当前非wifi环境,点击确定开始更新!", size);
string msg = string.Format(SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.NOT_WIFI_CONFIRM), size);
//> msgBox.Show("确定", msg, (result) =>
msgBox.Show(SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.CONFIRM), msg, (result) =>
{
startDownAction();
slider.SetValue(0f);
// 打点 - 开始更新
SDK.SdkCustomEvent.CustomEvent("开始热更");
});
break;
case ResourcesUpdateState.DownLoadWithWifi:
float size2 = 1f * (long)(param as object[])[0] / 1024 / 1024;
Action startDownAction2 = (param as object[])[1] as Action;
//> string msg2 = string.Format("检测到资源更新{0:f2}MB, 点击确定开始更新!", size2);
string msg2 = string.Format(SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.WIFI_CONFIRM), size2);
//> msgBox.Show("确定", msg2, (result) =>
msgBox.Show(SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.CONFIRM), msg2, (result) =>
{
startDownAction2();
slider.SetValue(0f);
// 打点 - 开始更新
SDK.SdkCustomEvent.CustomEvent("开始热更");
});
break;
case ResourcesUpdateState.UpdateResourcesProgress:
OnResUpdateProgress(param as ResUpdateProgress);
break;
case ResourcesUpdateState.UpdateResourcesFailed:
//> msgBox.Show("重试", "下载资源文件失败,请确认网络后重试!", (result) =>
msgBox.Show(SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.RETRY), SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.DOWNlOAD_RESOURCES_FILE_FAILED_CONFIRM_WIFI), (result) =>
{
BeginUpdatePlatform();
});
break;
case ResourcesUpdateState.Success:
VersionPar vp = (VersionPar)param;
//string version = (string)param;
VersionManager.Instance.SaveVersion(vp);
OnUpdateFinish();
break;
case ResourcesUpdateState.OldPackageNeedChange:
//> msgBox.Show("与最新版本差异过大,请下载最新安装包!");
msgBox.Show(SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.DOWNLOAD_NEWEST_APP));
break;
}
}
///
/// 游戏更新进度
///
///
void OnGameUpdateProgress(DownLoadProgress progress)
{
slider.UpdateValue(progress.Progress);
//> tipsText.text = string.Format("下载进度:{0}/{1}MB ,下载速度:{2}KB/s", progress.SizeMB.ToString("f2"), progress.TotalSizeMB.ToString("f2"),progress.LoadSpeed.ToString("f2"));
tipsText.text = string.Format(SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.DOWNLOAD_PROGRESS_RATE), progress.SizeMB.ToString("f2"), progress.TotalSizeMB.ToString("f2"), progress.LoadSpeed.ToString("f2"));
}
///
/// 资源更新进度
///
///
void OnResUpdateProgress(ResUpdateProgress progress)
{
slider.UpdateValue(progress.Progress);
//> tipsText.text = string.Format("下载进度:{0}/{1}MB({2}%)", progress.SizeMB, progress.TotalSizeMB, (progress.SizeMB/progress.TotalSizeMB)*100);
tipsText.text = string.Format(SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.DOWNLOAD_PROGRESS), progress.SizeMB, progress.TotalSizeMB, (progress.SizeMB / progress.TotalSizeMB) * 100);
}
///
/// 更新结束
///
void OnUpdateFinish() {
//> tipsText.text = "更新完成";
tipsText.text = SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.UPDATE_COMPLETE);
slider.SetValue(1f);
StartCoroutine(LoadGlobalRes());
}
IEnumerator LoadGlobalRes() {
//> tipsText.text = "正在预加载资源,此过程不消耗流量。";
tipsText.text = SLanguageMoreLanguageMgr.Instance.GetLanguageChValBykey(more_language.RELOAD_RESOURCES);
slider.SetValue(0f);
GlobalResLoader loader = new GlobalResLoader();
loader.LoadGlobalRes(null);
while (!loader.IsLoadFinish) {
slider.UpdateValue(loader.Progress);
yield return 1;
}
slider.SetValue(1f);
yield return new WaitForSeconds(0.1f);
yield return UpdateFinish();
}
IEnumerator UpdateFinish() {
yield return new WaitForSeconds(0.2f);
DestroyImmediate(this.gameObject);
UpdateManager.Instance.UnLoadUpdateAsset();
App.Instance.StartUp();
}
}
}