Improve launch performance of Talk Back. 79/317979/5 accepted/tizen_unified accepted/tizen_unified_x accepted/tizen_unified_x_asan tizen accepted/tizen/unified/20250122.054558 accepted/tizen/unified/x/20250122.065428 accepted/tizen/unified/x/asan/20250211.003558
authorshahrukh.i <shahrukh.i@samsung.com>
Fri, 10 Jan 2025 08:16:05 +0000 (14:16 +0600)
committershahrukh.i <shahrukh.i@samsung.com>
Mon, 13 Jan 2025 13:06:32 +0000 (19:06 +0600)
[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 <shahrukh.i@samsung.com>
SettingAccessibility/SettingAccessibility/SettingAccessibility.cs
packaging/org.tizen.cssetting-accessibility-1.1.0.rpk

index 6728913d5f8ba28826640024190c573d44329230..a8d7db26307204bfb4e7f3f3d9cf2b26e4f935af 100644 (file)
@@ -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<View> sections = new List<View>();
 
         static Dictionary<Voice, string> voiceTypeResourceKeys = new Dictionary<Voice, string>
             {
@@ -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
index 621fc331194bdd48602ce42d72bdd7847e273779..7f7323b132b8111ffa087ce3484e1e91774b2fae 100644 (file)
Binary files a/packaging/org.tizen.cssetting-accessibility-1.1.0.rpk and b/packaging/org.tizen.cssetting-accessibility-1.1.0.rpk differ