22
33import android .content .Context ;
44import android .content .SharedPreferences ;
5+ import android .content .res .Configuration ;
56import android .os .Bundle ;
67import android .view .MenuItem ;
78import androidx .appcompat .app .AppCompatActivity ;
8- import androidx .preference .CheckBoxPreference ;
9- import androidx .preference .ListPreference ;
109import androidx .preference .Preference ;
1110import androidx .preference .PreferenceFragmentCompat ;
1211import androidx .preference .PreferenceManager ;
1312import com .google .android .material .appbar .MaterialToolbar ;
1413import java .io .File ;
1514import java .util .Arrays ;
1615import java .util .List ;
16+ import java .util .Locale ;
1717import org .xedox .utils .BaseActivity ;
1818import org .xedox .utils .dialog .ErrorDialog ;
1919import org .xedox .utils .format .FormatConfig ;
20- import org .xedox .utils .format .IFormat ;
2120import org .xedox .utils .preference .MaterialListPreference ;
2221import org .xedox .webaide .dialog .CopyAssetsDialog ;
2322import org .xedox .webaide .sora .SoraEditorManager ;
@@ -28,13 +27,249 @@ public class SettingsActivity extends BaseActivity {
2827
2928 @ Override
3029 protected void onCreate (Bundle savedInstanceState ) {
30+ applyLocale (this );
3131 super .onCreate (savedInstanceState );
3232 try {
3333 setContentView (R .layout .activity_settings );
3434 toolbar = findViewById (R .id .toolbar );
3535 setSupportActionBar (toolbar );
3636 getSupportActionBar ().setDisplayHomeAsUpEnabled (true );
3737 getSupportActionBar ().setDisplayShowHomeEnabled (true );
38+ if (savedInstanceState == null ) {
39+ getSupportFragmentManager ()
40+ .beginTransaction ()
41+ .replace (R .id .content , new SettingsFragment ())
42+ .commit ();
43+ }
44+ } catch (Exception err ) {
45+ ErrorDialog .show (this , err );
46+ }
47+ }
48+
49+ public static void applyLocale (Context context ) {
50+ SharedPreferences prefs = PreferenceManager .getDefaultSharedPreferences (context );
51+ String lang = prefs .getString ("language_pref" , "en" );
52+ Locale locale = new Locale (lang );
53+ Locale .setDefault (locale );
54+ Configuration config = new Configuration ();
55+ config .setLocale (locale );
56+ context .getResources ().updateConfiguration (config , context .getResources ().getDisplayMetrics ());
57+ }
58+
59+ @ Override
60+ public boolean onOptionsItemSelected (MenuItem item ) {
61+ int id = item .getItemId ();
62+ if (id == android .R .id .home ) {
63+ handleBackPressed ();
64+ return true ;
65+ }
66+ return super .onOptionsItemSelected (item );
67+ }
68+
69+ @ Override
70+ public void handleBackPressed () {
71+ if (getSupportFragmentManager ().getBackStackEntryCount () > 0 ) {
72+ getSupportFragmentManager ().popBackStack ();
73+ } else {
74+ finish ();
75+ }
76+ }
77+
78+ public static class SettingsFragment extends PreferenceFragmentCompat
79+ implements Preference .OnPreferenceClickListener {
80+
81+ public SettingsFragment () {}
82+
83+ @ Override
84+ public void onCreatePreferences (Bundle extraArgs , String root ) {
85+ setPreferencesFromResource (R .xml .settings_preferences , root );
86+ Preference generalPref = findPreference ("general_settings" );
87+ Preference editorPref = findPreference ("editor_settings" );
88+ if (generalPref != null ) {
89+ generalPref .setOnPreferenceClickListener (this );
90+ }
91+ if (editorPref != null ) {
92+ editorPref .setOnPreferenceClickListener (this );
93+ }
94+ }
95+
96+ @ Override
97+ public boolean onPreferenceClick (Preference preference ) {
98+ String key = preference .getKey ();
99+ if (key .equals ("general_settings" )) {
100+ navigateToFragment (new GeneralFragment ());
101+ return true ;
102+ } else if (key .equals ("editor_settings" )) {
103+ navigateToFragment (new EditorFragment ());
104+ return true ;
105+ }
106+ return false ;
107+ }
108+
109+ private void navigateToFragment (PreferenceFragmentCompat fragment ) {
110+ requireActivity ()
111+ .getSupportFragmentManager ()
112+ .beginTransaction ()
113+ .replace (R .id .content , fragment )
114+ .addToBackStack (null )
115+ .commit ();
116+ }
117+ }
118+
119+ public static class GeneralFragment extends PreferenceFragmentCompat
120+ implements Preference .OnPreferenceChangeListener {
121+
122+ public GeneralFragment () {}
123+
124+ @ Override
125+ public void onCreatePreferences (Bundle extraArgs , String root ) {
126+ setPreferencesFromResource (R .xml .settings_general , root );
127+ Preference appDialogTypePref = findPreference ("app_dialog_type" );
128+ Preference recopyAssetsPref = findPreference ("recopy_assets" );
129+ recopyAssetsPref .setOnPreferenceClickListener (
130+ (v ) -> {
131+ CopyAssetsDialog .show (requireActivity ());
132+ return true ;
133+ });
134+ if (appDialogTypePref != null ) {
135+ appDialogTypePref .setOnPreferenceChangeListener (this );
136+ }
137+
138+ MaterialListPreference languagePref = new MaterialListPreference (requireContext ());
139+ languagePref .setKey ("language_pref" );
140+ languagePref .setTitle ("Application language" );
141+ languagePref .setSummary ("Select language for the app" );
142+ languagePref .setEntries (new CharSequence []{"English" , "Русский" });
143+ languagePref .setEntryValues (new CharSequence []{"en" , "ru" });
144+ SharedPreferences sp = PreferenceManager .getDefaultSharedPreferences (requireContext ());
145+ String currentLang = sp .getString ("language_pref" , "en" );
146+ languagePref .setValue (currentLang );
147+ languagePref .setOnPreferenceChangeListener ((preference , newValue ) -> {
148+ String lang = newValue .toString ();
149+ sp .edit ().putString ("language_pref" , lang ).apply ();
150+ applyLocale (requireContext ());
151+ requireActivity ().recreate ();
152+ return true ;
153+ });
154+ getPreferenceScreen ().addPreference (languagePref );
155+ }
156+
157+ @ Override
158+ public boolean onPreferenceChange (Preference preference , Object newValue ) {
159+ String key = preference .getKey ();
160+ SharedPreferences sp = PreferenceManager .getDefaultSharedPreferences (requireContext ());
161+ SharedPreferences .Editor editor = sp .edit ();
162+ if (key .equals ("app_dialog_type" )) {
163+ editor .putString (key , newValue .toString ()).apply ();
164+ AppCore .setDialogType (newValue .toString ());
165+ return true ;
166+ }
167+ return false ;
168+ }
169+ }
170+
171+ public static class EditorFragment extends PreferenceFragmentCompat
172+ implements Preference .OnPreferenceChangeListener {
173+
174+ public EditorFragment () {}
175+
176+ @ Override
177+ public void onCreatePreferences (Bundle extraArgs , String root ) {
178+ setPreferencesFromResource (R .xml .settings_editor , root );
179+ Preference useTabPref = findPreference ("editor_use_tab" );
180+ Preference indentSizePref = findPreference ("editor_indent_size" );
181+ if (useTabPref != null ) {
182+ useTabPref .setOnPreferenceChangeListener (this );
183+ }
184+ if (indentSizePref != null ) {
185+ indentSizePref .setOnPreferenceChangeListener (this );
186+ }
187+ MaterialListPreference fontsPref = findPreference ("editor_font" );
188+ try {
189+ List <File > fontSources = Arrays .asList (AppCore .fontList ());
190+ String [] entries = new String [fontSources .size ()];
191+ String [] values = new String [fontSources .size ()];
192+ for (int i = 0 ; i < fontSources .size (); i ++) {
193+ File fontFile = fontSources .get (i );
194+ entries [i ] = fontFile .getName ();
195+ values [i ] = fontFile .getAbsolutePath ();
196+ }
197+ fontsPref .setEntries (entries );
198+ fontsPref .setEntryValues (values );
199+ SharedPreferences sp = PreferenceManager .getDefaultSharedPreferences (requireContext ());
200+ String currentFont = sp .getString ("editor_font" , null );
201+ if (currentFont == null ) {
202+ String defaultFont = AppCore .dir ("fonts" ) + "SourceCodePro-Regular.ttf" ;
203+ fontsPref .setValue (defaultFont );
204+ sp .edit ().putString ("editor_font" , defaultFont ).apply ();
205+ } else {
206+ fontsPref .setValue (currentFont );
207+ }
208+ } catch (Exception err ) {
209+ ErrorDialog .show (requireActivity (), err );
210+ }
211+ MaterialListPreference themesPref = findPreference ("editor_theme" );
212+ try {
213+ SoraEditorManager .Theme [] themes = SoraEditorManager .getThemesList ();
214+ String [] names = new String [themes .length ];
215+ for (int i = 0 ; i < themes .length ; i ++) {
216+ names [i ] = themes [i ].name ;
217+ }
218+ themesPref .setEntries (names );
219+ themesPref .setEntryValues (names );
220+ SharedPreferences sp = PreferenceManager .getDefaultSharedPreferences (requireContext ());
221+ String currentTheme = sp .getString ("editor_theme" , null );
222+ if (currentTheme == null ) {
223+ String defaultTheme = "Darcula" ;
224+ themesPref .setValue (defaultTheme );
225+ sp .edit ().putString ("editor_theme" , defaultTheme ).apply ();
226+ } else {
227+ themesPref .setValue (currentTheme );
228+ }
229+ } catch (Exception err ) {
230+ ErrorDialog .show (requireActivity (), err );
231+ }
232+ if (themesPref != null ) {
233+ themesPref .setOnPreferenceChangeListener (this );
234+ }
235+ if (fontsPref != null ) {
236+ fontsPref .setOnPreferenceChangeListener (this );
237+ }
238+ }
239+
240+ @ Override
241+ public boolean onPreferenceChange (Preference preference , Object newValue ) {
242+ String key = preference .getKey ();
243+ SharedPreferences sp = PreferenceManager .getDefaultSharedPreferences (requireContext ());
244+ SharedPreferences .Editor editor = sp .edit ();
245+ String value = newValue .toString ();
246+ if (key .equals ("editor_use_tab" )) {
247+ boolean useTab = (Boolean ) newValue ;
248+ editor .putBoolean (key , useTab ).apply ();
249+ FormatConfig .getInstance ().setUseTab (useTab );
250+ return true ;
251+ } else if (key .equals ("editor_font" )) {
252+ editor .putString (key , value ).apply ();
253+ SoraEditorManager .updateFont (value );
254+ return true ;
255+ } else if (key .equals ("editor_theme" )) {
256+ editor .putString (key , value ).apply ();
257+ SoraEditorManager .updateTheme (value );
258+ return true ;
259+ } else if (key .equals ("editor_indent_size" )) {
260+ try {
261+ int indentSize = Integer .parseInt (value );
262+ editor .putString (key , value ).apply ();
263+ FormatConfig .getInstance ().setIndentSize (indentSize );
264+ } catch (Exception e ) {
265+ ErrorDialog .show (requireActivity (), e );
266+ }
267+ return true ;
268+ }
269+ return false ;
270+ }
271+ }
272+ } getSupportActionBar ().setDisplayShowHomeEnabled (true );
38273
39274 if (savedInstanceState == null ) {
40275 getSupportFragmentManager ()
0 commit comments