From: shahrukh.i Date: Fri, 10 Jan 2025 08:16:05 +0000 (+0600) Subject: Improve launch performance of Talk Back. X-Git-Tag: accepted/tizen/unified/20250122.054558^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fheads%2Faccepted%2Ftizen_unified_x;p=profile%2Fiot%2Fapps%2Fdotnet%2Fsetting-accessibility.git Improve launch performance of Talk Back. [Problem] [TTEN-706] Talk Back Takes Too Much Time to Load. [Cause & Measure] Cause: 1. Some unnecessary function call. 2. Whole screen is loaded and rendered at the same time. Measure: 1. Removed unnecessary function call. 2. Rendered options sequentially. 3. Used async programming. Change-Id: Idcb79360b08b5260c2b218323be507fa69032c29 Signed-off-by: shahrukh.i --- diff --git a/SettingAccessibility/SettingAccessibility/SettingAccessibility.cs b/SettingAccessibility/SettingAccessibility/SettingAccessibility.cs index 6728913..a8d7db2 100644 --- a/SettingAccessibility/SettingAccessibility/SettingAccessibility.cs +++ b/SettingAccessibility/SettingAccessibility/SettingAccessibility.cs @@ -5,6 +5,8 @@ using Tizen.NUI.Components; using SettingAccessibility.TextResources; using Tizen.Uix.Tts; using SettingCore.Views; +using System.Threading.Tasks; +using Tizen.Applications; namespace SettingAccessibility { @@ -22,9 +24,7 @@ namespace SettingAccessibility private static readonly string VCONFKEY_SETAPPL_ACCESSIBILITY_SCREEN_READER_HAPTIC = "db/setting/accessibility/screen_reader/haptic"; private static readonly string VCONFKEY_SETAPPL_ACCESSIBILITY_SCREEN_READER_SOUND_FEEDBACK = "db/setting/accessibility/screen_reader/sound_feedback"; - private View scrollableContent; - private IList sections = new List(); static Dictionary voiceTypeResourceKeys = new Dictionary { @@ -40,19 +40,6 @@ namespace SettingAccessibility Interop.TTS.Setting.Initialize(); - // log debug information - var tts = new Tizen.Uix.Tts.TtsClient(); - var defaultVoice = tts.DefaultVoice; - Tizen.Log.Verbose("SettingTalkBack", $"DefaultVoice Type: {defaultVoice.VoiceType}, Language: {defaultVoice.Language}"); - Tizen.Log.Verbose("SettingTalkBack", $"IsScreenReaderOn: {tts.IsScreenReaderOn}"); - var speedRange = tts.GetSpeedRange(); - Tizen.Log.Verbose("SettingTalkBack", $"Speed Range Min: {speedRange.Min}, Normal: {speedRange.Normal}, Max: {speedRange.Max}"); - var supportedVoices = tts.GetSupportedVoices(); - foreach (var voice in supportedVoices) - { - Tizen.Log.Verbose("SettingTalkBack", $"SupportedVoices Type: {voice.VoiceType}, Language: {voice.Language}"); - } - scrollableContent = new ScrollableBase() { WidthSpecification = LayoutParamPolicies.MatchParent, @@ -66,114 +53,203 @@ namespace SettingAccessibility }; CreateContent(); - return scrollableContent; } - private void CreateContent() + private async Task CreateScreenReader() { - // remove all sections from scrollable content - foreach (var view in sections) + await CoreApplication.Post(() => { - scrollableContent.Remove(view); - } - sections.Clear(); + Interop.Vconf.GetVconfBool(VCONFKEY_SETAPPL_ACCESSIBILITY_TTS, out bool isScreenReaderOn); + // TODO: replace fixed string with Resources dictionary + var screenReader = new SettingCore.Views.SwitchListItem(NUIGadgetResourceManager.GetString(nameof(Resources.IDS_ST_SCREEN_READER_TTS)), isSelected: isScreenReaderOn); + screenReader.Switch.SelectedChanged += (s, e) => + { + Tizen.Log.Debug("SettingTalkBack", $"ScreenReader selection changed"); + Interop.Vconf.SetVconfBool(VCONFKEY_SETAPPL_ACCESSIBILITY_TTS, e.IsSelected); + }; + scrollableContent.Add(screenReader); - Interop.Vconf.GetVconfBool(VCONFKEY_SETAPPL_ACCESSIBILITY_TTS, out bool isScreenReaderOn); - // TODO: replace fixed string with Resources dictionary - var screenReader = new SettingCore.Views.SwitchListItem(NUIGadgetResourceManager.GetString(nameof(Resources.IDS_ST_SCREEN_READER_TTS)), isSelected: isScreenReaderOn); - screenReader.Switch.SelectedChanged += (s, e) => { - Interop.Vconf.SetVconfBool(VCONFKEY_SETAPPL_ACCESSIBILITY_TTS, e.IsSelected); - }; - sections.Add(screenReader); + Tizen.Log.Debug("SettingTalkBack", "CreateScreenReader Created"); + return true; + }); + } - var info = new TextLabel + private async Task CreateInfo() + { + await CoreApplication.Post(() => { - Text = NUIGadgetResourceManager.GetString(nameof(Resources.IDS_ACCS_BODY_WHILE_SCREEN_READER_IS_ENABLED_YOUR_PHONE_WILL_PROVIDE_VOICE_FEEDBACK_FOR_EXAMPLE_SCREEN_READER_WILL_MSG)), - MultiLine = true, - PixelSize = 24.SpToPx(), - TextColor = new Color("#83868F"), - WidthSpecification = LayoutParamPolicies.MatchParent, - Margin = new Extents(16, 16, 8, 8).SpToPx(), - }; - sections.Add(info); + TextLabel info = new TextLabel + { + Text = NUIGadgetResourceManager.GetString(nameof(Resources.IDS_ACCS_BODY_WHILE_SCREEN_READER_IS_ENABLED_YOUR_PHONE_WILL_PROVIDE_VOICE_FEEDBACK_FOR_EXAMPLE_SCREEN_READER_WILL_MSG)), + MultiLine = true, + PixelSize = 24.SpToPx(), + TextColor = new Color("#83868F"), + WidthSpecification = LayoutParamPolicies.MatchParent, + Margin = new Extents(16, 16, 8, 8).SpToPx(), + }; + scrollableContent.Add(info); + Tizen.Log.Debug("SettingTalkBack", "CreateInfo Created"); + return true; + }); + } + + private async Task CreateLanguage() + { var tts = new Tizen.Uix.Tts.TtsClient(); var defaultVoice = tts.DefaultVoice; - var speedRange = tts.GetSpeedRange(); tts.Dispose(); + await CoreApplication.Post(() => + { + var language = SettingCore.Views.TextListItem.CreatePrimaryTextItemWithSecondaryText(NUIGadgetResourceManager.GetString(nameof(Resources.IDS_ST_VOICE_TYPE_AND_LANGUAGE)), $"{GetName(defaultVoice)}, {defaultVoice.Language}"); + language.Clicked += (s, e) => + { + NavigateTo(MenuProvider.TalkBack_Language); + }; + scrollableContent.Add(language); + + Tizen.Log.Debug("SettingTalkBack", "CreateLanguage Created"); + return true; + }); + } - var language = SettingCore.Views.TextListItem.CreatePrimaryTextItemWithSecondaryText(NUIGadgetResourceManager.GetString(nameof(Resources.IDS_ST_VOICE_TYPE_AND_LANGUAGE)), $"{GetName(defaultVoice)}, {defaultVoice.Language}"); - language.Clicked += (s, e) => + private async Task CreateVolume() + { + await CoreApplication.Post(() => { - NavigateTo(MenuProvider.TalkBack_Language); - }; - sections.Add(language); + var volume = SettingCore.Views.TextListItem.CreatePrimaryTextItemWithSecondaryText(NUIGadgetResourceManager.GetString(nameof(Resources.IDS_ST_TTS_VOICE_VOLUME)), "75%"); + volume.IsEnabled = false; + scrollableContent.Add(volume); + + Tizen.Log.Debug("SettingTalkBack", "Volume Created"); + return true; + }); + } - var volume = SettingCore.Views.TextListItem.CreatePrimaryTextItemWithSecondaryText(NUIGadgetResourceManager.GetString(nameof(Resources.IDS_ST_TTS_VOICE_VOLUME)), "75%"); - volume.IsEnabled = false; - sections.Add(volume); + private async Task CreateSpeechRate() + { + var tts = new Tizen.Uix.Tts.TtsClient(); + var speedRange = tts.GetSpeedRange(); // The range of TTS speed is 1 to 15. (Normal is 8) - var speechRate = new SpeechRateRow(); + SpeechRateRow speechRate = new SpeechRateRow(); speechRate.Slider.MinValue = speedRange.Min; speechRate.Slider.MaxValue = speedRange.Max; speechRate.Slider.CurrentValue = speedRange.Normal; - speechRate.Slider.ValueChanged += (s, e) => + await CoreApplication.Post(() => { - double ratio = (double)(e.CurrentValue - speechRate.Slider.MinValue) / (speechRate.Slider.MaxValue - speechRate.Slider.MinValue); - int speed = (int)((speedRange.Max - speedRange.Min) * ratio + speedRange.Min); - SettingCore.Logger.Verbose($"Speech rate {speed}"); + speechRate.Slider.ValueChanged += (s, e) => + { + double ratio = (double)(e.CurrentValue - speechRate.Slider.MinValue) / (speechRate.Slider.MaxValue - speechRate.Slider.MinValue); + int speed = (int)((speedRange.Max - speedRange.Min) * ratio + speedRange.Min); + SettingCore.Logger.Verbose($"Speech rate {speed}"); - Interop.TTS.Setting.SetSpeed(speed); - }; - sections.Add(speechRate); + Interop.TTS.Setting.SetSpeed(speed); + }; + + scrollableContent.Add(speechRate); + tts.Dispose(); + + Tizen.Log.Debug("SettingTalkBack", "SpeechRate Created"); + return true; + }); + } + private void CreateKeyboardFeedback() + { Interop.Vconf.GetVconfBool(VCONFKEY_SETAPPL_ACCESSIBILITY_SCREEN_READER_KEYBOARD_FEEDBACK, out bool keyboardFeedbackValue); var keyboardFeedback = new SettingCore.Views.SwitchListItem(NUIGadgetResourceManager.GetString(nameof(Resources.IDS_ST_TTS_KEYBOARD_FEEDBACK)), NUIGadgetResourceManager.GetString(nameof(Resources.IDS_ST_TTS_KEYBOARD_INPUT_ALOAD)), keyboardFeedbackValue); keyboardFeedback.Switch.SelectedChanged += (s, e) => { + Tizen.Log.Debug("SettingTalkBack", $"KeyboardFeedback selection changed"); Interop.Vconf.SetVconfBool(VCONFKEY_SETAPPL_ACCESSIBILITY_SCREEN_READER_KEYBOARD_FEEDBACK, e.IsSelected); }; - sections.Add(keyboardFeedback); + scrollableContent.Add(keyboardFeedback); + + Tizen.Log.Debug("SettingTalkBack", "KeyboardFeedback Created"); + } + private void CreateReadUsageHintsAloud() + { Interop.Vconf.GetVconfBool(VCONFKEY_SETAPPL_ACCESSIBILITY_SCREEN_READER_DESCRIPTION, out bool readUsageHintsAloudValue); var readUsageHintsAloud = new SettingCore.Views.SwitchListItem(NUIGadgetResourceManager.GetString(nameof(Resources.IDS_ST_TTS_READ_USAGE_HINTS_ALOAD)), isSelected: readUsageHintsAloudValue); readUsageHintsAloud.Switch.SelectedChanged += (s, e) => { + Tizen.Log.Debug("SettingTalkBack", $"ReadUsageHintsAloud selection changed"); Interop.Vconf.SetVconfBool(VCONFKEY_SETAPPL_ACCESSIBILITY_SCREEN_READER_DESCRIPTION, e.IsSelected); }; - sections.Add(readUsageHintsAloud); + scrollableContent.Add(readUsageHintsAloud); - Interop.Vconf.GetVconfBool(VCONFKEY_SETAPPL_ACCESSIBILITY_SCREEN_READER_HAPTIC, out bool vibrationFeedbackValue); - var vibrationFeedback = new SettingCore.Views.SwitchListItem(NUIGadgetResourceManager.GetString(nameof(Resources.IDS_ST_TTS_VIBRATION_FEEDBACK)), isSelected: vibrationFeedbackValue); - vibrationFeedback.Switch.SelectedChanged += (s, e) => - { - Interop.Vconf.SetVconfBool(VCONFKEY_SETAPPL_ACCESSIBILITY_SCREEN_READER_HAPTIC, e.IsSelected); - }; - sections.Add(vibrationFeedback); + Tizen.Log.Debug("SettingTalkBack", "ReadUsageHintsAloud Created"); + } - Interop.Vconf.GetVconfBool(VCONFKEY_SETAPPL_ACCESSIBILITY_SCREEN_READER_SOUND_FEEDBACK, out bool soundFeedbackValue); - var soundFeedback = new SettingCore.Views.SwitchListItem(NUIGadgetResourceManager.GetString(nameof(Resources.IDS_ST_TTS_SOUND_FEEDBACK)), isSelected: soundFeedbackValue); - soundFeedback.Switch.SelectedChanged += (s, e) => + private async Task CreateVibrationFeedback() + { + await CoreApplication.Post(() => { - Interop.Vconf.SetVconfBool(VCONFKEY_SETAPPL_ACCESSIBILITY_SCREEN_READER_SOUND_FEEDBACK, e.IsSelected); - }; - sections.Add(soundFeedback); + Interop.Vconf.GetVconfBool(VCONFKEY_SETAPPL_ACCESSIBILITY_SCREEN_READER_HAPTIC, out bool vibrationFeedbackValue); + var vibrationFeedback = new SettingCore.Views.SwitchListItem(NUIGadgetResourceManager.GetString(nameof(Resources.IDS_ST_TTS_VIBRATION_FEEDBACK)), isSelected: vibrationFeedbackValue); + vibrationFeedback.Switch.SelectedChanged += (s, e) => + { + Tizen.Log.Debug("SettingTalkBack", $"VibrationFeedback selection changed"); + Interop.Vconf.SetVconfBool(VCONFKEY_SETAPPL_ACCESSIBILITY_SCREEN_READER_HAPTIC, e.IsSelected); + }; + scrollableContent.Add(vibrationFeedback); - // TODO: replace fixed string with Resources dictionary - var statusBarInformation = SettingCore.Views.TextListItem.CreatePrimaryTextItemWithSubText(NUIGadgetResourceManager.GetString(nameof(Resources.IDS_ST_TTS_STATUS_BAR_INFO)), NUIGadgetResourceManager.GetString(nameof(Resources.IDS_ST_TTS_STATUS_BAR_INFO_DESCRIPTION))); - statusBarInformation.Clicked += (s, e) => + Tizen.Log.Debug("SettingTalkBack", "VibrationFeedback Created"); + return true; + }); + } + + private async Task CreateSoundFeedback() + { + await CoreApplication.Post(() => { - NavigateTo(MenuProvider.TalkBack_StatusBar); - }; - sections.Add(statusBarInformation); + Interop.Vconf.GetVconfBool(VCONFKEY_SETAPPL_ACCESSIBILITY_SCREEN_READER_SOUND_FEEDBACK, out bool soundFeedbackValue); + var soundFeedback = new SettingCore.Views.SwitchListItem(NUIGadgetResourceManager.GetString(nameof(Resources.IDS_ST_TTS_SOUND_FEEDBACK)), isSelected: soundFeedbackValue); + soundFeedback.Switch.SelectedChanged += (s, e) => + { + Tizen.Log.Debug("SettingTalkBack", $"SoundFeedback selection changed"); + Interop.Vconf.SetVconfBool(VCONFKEY_SETAPPL_ACCESSIBILITY_SCREEN_READER_SOUND_FEEDBACK, e.IsSelected); + }; + scrollableContent.Add(soundFeedback); + + Tizen.Log.Debug("SettingTalkBack", "SoundFeedback Created"); + return true; + }); + } - // add all sections to scrollable content - foreach (var view in sections) + private async Task CreateStatusBarInformation() + { + await CoreApplication.Post(() => { - scrollableContent.Add(view); - } + // TODO: replace fixed string with Resources dictionary + var statusBarInformation = SettingCore.Views.TextListItem.CreatePrimaryTextItemWithSubText(NUIGadgetResourceManager.GetString(nameof(Resources.IDS_ST_TTS_STATUS_BAR_INFO)), NUIGadgetResourceManager.GetString(nameof(Resources.IDS_ST_TTS_STATUS_BAR_INFO_DESCRIPTION))); + statusBarInformation.Clicked += (s, e) => + { + NavigateTo(MenuProvider.TalkBack_StatusBar); + }; + scrollableContent.Add(statusBarInformation); + + Tizen.Log.Debug("SettingTalkBack", "StatusBarInformation Created"); + return true; + }); + } + + private async Task CreateContent() + { + await CreateScreenReader(); + await CreateInfo(); + await CreateLanguage(); + await CreateVolume(); + await CreateSpeechRate(); + + CreateKeyboardFeedback(); + CreateReadUsageHintsAloud(); + CreateVibrationFeedback(); + CreateSoundFeedback(); + CreateStatusBarInformation(); } private string GetName(SupportedVoice defaultVoice) @@ -191,4 +267,4 @@ namespace SettingAccessibility base.OnDestroy(); } } -} +} \ No newline at end of file diff --git a/packaging/org.tizen.cssetting-accessibility-1.1.0.rpk b/packaging/org.tizen.cssetting-accessibility-1.1.0.rpk index 621fc33..7f7323b 100644 Binary files a/packaging/org.tizen.cssetting-accessibility-1.1.0.rpk and b/packaging/org.tizen.cssetting-accessibility-1.1.0.rpk differ