using KdanCommon.CMSCollection.Data; using KdanCommon.Helpers; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using Windows.Data.Json; using Windows.Globalization; using Windows.Web.Http; using Windows.Web.Http.Filters; namespace KdanCommon.CMSCollection { public class CMSCollection { public static string CMSDomain = "https://cms.kdanmobile.com"; private List settingList = null; private HttpClient httpClient = null; private Uri windowsCardsUri = null; private Uri pdfViewerEventBarSettingUri = null; private Uri pdfOtherSettingUri = null; private string appType = null; private bool loadCardsOnly = false; private SemaphoreSlim loadSettingSS = new SemaphoreSlim(1); private bool isLoaded = false; public CMSCollection(string appType, bool loadCardOnly = true) { var filter = new HttpBaseProtocolFilter(); filter.CacheControl.ReadBehavior = HttpCacheReadBehavior.MostRecent; httpClient = new HttpClient(filter); windowsCardsUri = new Uri($"{CMSDomain}/items/windows_cards"); pdfViewerEventBarSettingUri = new Uri($"{CMSDomain}/items/pdf_remote_config"); pdfOtherSettingUri = new Uri($"{CMSDomain}/items/PDF_UWP_RemoteConfig"); this.appType = appType; this.loadCardsOnly = loadCardOnly; settingList = new List(); } #region Public Method public async Task GetSetting(string settingId) { await LoadSettings(); return settingList.FirstOrDefault(s => s.SettingName == settingId); } public async Task> GetCardSettings() { await LoadSettings(); return settingList.Where(s => s is WindowsCardSetting).Select(s => s as WindowsCardSetting).OrderByDescending(w => w.Weight).ToList(); } #endregion #region Private Method private async Task LoadSettings() { try { await loadSettingSS.WaitAsync(); if (!isLoaded) { settingList.Clear(); // check internet var allTask = new List(); allTask.Add(GetWindowsCards()); if (!loadCardsOnly) { allTask.Add(GetViewerEventBarSetting()); allTask.Add(GetOtherSetting()); } await Task.WhenAll(allTask); isLoaded = true; } } catch { } finally { loadSettingSS.Release(); } } private async Task GetViewerEventBarSetting() { var region = GetSystemRegion(); var appLang = GetAppLanguage(); var querys = new List>(); querys.Add(new KeyValuePair("deep[evnet_bar_text_translations][_filter][languages_code][_eq]", appLang)); querys.Add(new KeyValuePair("deep[dialog_text_translations][_filter][languages_code][_eq]", appLang)); querys.Add(new KeyValuePair("deep[dialog_button][dialog_button_translations][_filter][languages_code][_eq]", appLang)); querys.Add(new KeyValuePair("deep[do_not_show_translations][_filter][languages_code][_eq]", appLang)); querys.Add(new KeyValuePair("filter[platform][_eq]", "windows")); querys.Add(new KeyValuePair("filter[regions][_contains]", region)); querys.Add(new KeyValuePair("fields", "*,do_not_show_translations.*,evnet_bar_text_translations.*,dialog_text_translations.*,dialog_button.*,dialog_button.dialog_button_translations.*")); var result = await httpClient.GetRequest(pdfViewerEventBarSettingUri, querys); if (result.StatusCode == HttpStatusCode.Ok) { var jsonString = await result.Content.ReadAsStringAsync(); var response = JsonTool.DeserializeJSON(jsonString); if (response != null && response.Data != null && response.Data.Length > 0) settingList.Add(response.Data[0]); } } private async Task GetOtherSetting() { var querys = new List>(); querys.Add(new KeyValuePair("filter[status][_eq]", "published")); querys.Add(new KeyValuePair("filter[appTypes][_contains]", appType)); querys.Add(new KeyValuePair("fields", "*")); var result = await httpClient.GetRequest(pdfOtherSettingUri, querys); if (result.StatusCode == HttpStatusCode.Ok) { var jsonString = await result.Content.ReadAsStringAsync(); dynamic dyna = DynamicJsonHelper.ToDynamicJson(jsonString); if (dyna == null) return; List settings = DynamicJsonHelper.GetArraySafety(dyna.data); if (settings == null) return; foreach (var setting in settings) { string configName = DynamicJsonHelper.GetValueSafety(setting.config_name, null); if (!string.IsNullOrEmpty(configName) && setting.json_data != null) settingList.Add(new JsonSetting(configName, setting.json_data)); } } } private async Task GetWindowsCards() { string region = GetSystemRegion(); string lang = GetAppLanguage(); var querys = new List>(); querys.Add(new KeyValuePair("deep[Information][_filter][languages_code][_eq]", lang)); querys.Add(new KeyValuePair("filter[_or][0][include_regions][_eq]", "true")); querys.Add(new KeyValuePair("filter[_or][0][regions][_contains]", region)); querys.Add(new KeyValuePair("filter[_or][1][include_regions][_eq]", "false")); querys.Add(new KeyValuePair("filter[_or][1][regions][_ncontains]", region)); querys.Add(new KeyValuePair("filter[appTypes][_contains]", appType)); querys.Add(new KeyValuePair("filter[status][_eq]", "published")); querys.Add(new KeyValuePair("fields", "*,Information.*")); var result = await httpClient.GetRequest(windowsCardsUri, querys); if (result.StatusCode == HttpStatusCode.Ok) { var jsonString = await result.Content.ReadAsStringAsync(); var response = JsonTool.DeserializeJSON(jsonString); if (response != null && response.Data != null && response.Data.Length > 0) { foreach (var card in response.Data) settingList.Add(card); } } } private string GetSystemRegion() { var geographyCountryCode = new GeographicRegion().CodeTwoLetter; switch (geographyCountryCode) { case "GB": case "US": case "TW": case "CN": case "JP": case "ES": case "IT": case "FR": case "DE": case "RU": case "PT": case "KR": return geographyCountryCode; default: return "OTHER"; } } private string GetAppLanguage() { try { var currentLang = Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView().Languages[0]; switch (currentLang) { case "de-DE": case "de": return "de"; case "es-ES": case "es": return "es"; case "fr-FR": case "fr": return "fr"; case "it-IT": case "it": return "it"; case "ja-JP": case "ja": return "ja"; case "zh-Hans-CN": case "zh-Hans": case "zh-CN": return "zh-cn"; case "zh-Hant-TW": case "zh-Hant": case "zh-TW": return "zh-tw"; case "ru-RU": case "ru": return "ru"; case "ko-KR": case "ko": return "ko"; case "pt-PT": case "pt": return "pt"; default: return "en"; } } catch { return "en"; } } #endregion } }