FreeRDP
Loading...
Searching...
No Matches
BookmarkActivity.java
1/*
2 Bookmark editing activity
3
4 Copyright 2013 Thincast Technologies GmbH, Author: Martin Fleisz
5
6 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
7 If a copy of the MPL was not distributed with this file, You can obtain one at
8 http://mozilla.org/MPL/2.0/.
9*/
10
11package com.freerdp.freerdpcore.presentation;
12
13import android.content.SharedPreferences;
14import android.os.Bundle;
15import android.view.Menu;
16import android.view.MenuInflater;
17import android.view.MenuItem;
18
19import androidx.activity.OnBackPressedCallback;
20import androidx.appcompat.app.AlertDialog;
21import androidx.appcompat.app.AppCompatActivity;
22import androidx.lifecycle.ViewModelProvider;
23import androidx.preference.Preference;
24import androidx.preference.PreferenceFragmentCompat;
25import androidx.preference.PreferenceScreen;
26
27import com.freerdp.freerdpcore.R;
28import com.freerdp.freerdpcore.domain.BookmarkBase;
29import com.freerdp.freerdpcore.services.LibFreeRDP;
30
31public class BookmarkActivity
32 extends AppCompatActivity implements PreferenceFragmentCompat.OnPreferenceStartFragmentCallback
33{
34 public static final String PARAM_CONNECTION_REFERENCE = "conRef";
35 private static final String TAG = "BookmarkActivity";
36 private static final String PREFS_NAME = "TEMP";
37
38 private BookmarkViewModel viewModel;
39
40 private final SharedPreferences.OnSharedPreferenceChangeListener prefsListener =
41 (prefs, key) -> viewModel.setSettingsChanged(true);
42
43 @Override protected void onCreate(Bundle savedInstanceState)
44 {
45 super.onCreate(savedInstanceState);
46 setContentView(R.layout.activity_bookmark);
47
48 if (getSupportActionBar() != null)
49 {
50 getSupportActionBar().setDisplayHomeAsUpEnabled(true);
51 }
52
53 viewModel = new ViewModelProvider(this).get(BookmarkViewModel.class);
54
55 viewModel.getSaveCompleteEvent().observe(this, isComplete -> {
56 if (isComplete)
57 finish();
58 });
59
60 viewModel.getBookmarkLiveData().observe(this, bookmark -> {
61 // Once data is loaded and written to SharedPreferences, attach the fragment
62 if (getSupportFragmentManager().findFragmentByTag("main") == null)
63 {
64 getSupportFragmentManager()
65 .beginTransaction()
66 .replace(R.id.bookmark_fragment_container, new MainFragment(), "main")
67 .commit();
68 }
69
70 getSharedPreferences(PREFS_NAME, MODE_PRIVATE)
71 .registerOnSharedPreferenceChangeListener(prefsListener);
72 });
73
74 viewModel.loadBookmark(getIntent().getExtras(),
75 getSharedPreferences(PREFS_NAME, MODE_PRIVATE));
76
77 getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
78 @Override public void handleOnBackPressed()
79 {
80 if (getSupportFragmentManager().getBackStackEntryCount() > 0)
81 getSupportFragmentManager().popBackStack();
82 else
83 handleRootBackPress();
84 }
85 });
86 }
87
88 @Override protected void onDestroy()
89 {
90 super.onDestroy();
91 getSharedPreferences(PREFS_NAME, MODE_PRIVATE)
92 .unregisterOnSharedPreferenceChangeListener(prefsListener);
93 }
94
95 @Override public boolean onSupportNavigateUp()
96 {
97 getOnBackPressedDispatcher().onBackPressed();
98 return true;
99 }
100
101 @Override public boolean onCreateOptionsMenu(Menu menu)
102 {
103 MenuInflater inflater = getMenuInflater();
104 inflater.inflate(R.menu.bookmark_menu, menu);
105 return true;
106 }
107
108 @Override public boolean onOptionsItemSelected(MenuItem item)
109 {
110 if (item.getItemId() == R.id.action_save)
111 {
112 SharedPreferences prefs = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
113 if (!verifySettings(prefs))
114 {
115 new AlertDialog.Builder(this)
116 .setTitle(R.string.error_bookmark_incomplete_title)
117 .setMessage(R.string.error_bookmark_incomplete)
118 .setPositiveButton(R.string.cancel, (d, w) -> finish())
119 .setNegativeButton(R.string.cont, (d, w) -> d.cancel())
120 .show();
121 }
122 else
123 {
124 viewModel.saveBookmark(prefs);
125 }
126 return true;
127 }
128 return super.onOptionsItemSelected(item);
129 }
130
131 @Override
132 public boolean onPreferenceStartFragment(PreferenceFragmentCompat caller, Preference pref)
133 {
134 PreferenceFragmentCompat fragment =
135 (PreferenceFragmentCompat)getSupportFragmentManager().getFragmentFactory().instantiate(
136 getClassLoader(), pref.getFragment());
137 fragment.setArguments(pref.getExtras());
138
139 getSupportFragmentManager()
140 .beginTransaction()
141 .replace(R.id.bookmark_fragment_container, fragment)
142 .addToBackStack(null)
143 .commit();
144 return true;
145 }
146
147 private void handleRootBackPress()
148 {
149 SharedPreferences prefs = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
150 if (!verifySettings(prefs))
151 {
152 new AlertDialog.Builder(this)
153 .setTitle(R.string.error_bookmark_incomplete_title)
154 .setMessage(R.string.error_bookmark_incomplete)
155 .setPositiveButton(R.string.cancel, (d, w) -> finish())
156 .setNegativeButton(R.string.cont, (d, w) -> d.cancel())
157 .show();
158 }
159 else if (viewModel.isNewBookmark() || viewModel.isSettingsChanged())
160 {
161 new AlertDialog.Builder(this)
162 .setTitle(R.string.dlg_title_save_bookmark)
163 .setMessage(R.string.dlg_save_bookmark)
164 .setPositiveButton(R.string.yes, (d, w) -> { viewModel.saveBookmark(prefs); })
165 .setNegativeButton(R.string.no, (d, w) -> finish())
166 .show();
167 }
168 else
169 {
170 finish();
171 }
172 }
173
174 private boolean verifySettings(SharedPreferences prefs)
175 {
176 return !prefs.getString("bookmark.label", "").isEmpty() &&
177 !prefs.getString("bookmark.hostname", "").isEmpty() &&
178 prefs.getInt("bookmark.port", -1) > 0;
179 }
180
183 // -------------------------------------------------------------------------
184
185 public static class MainFragment extends PreferenceFragmentCompat
186 {
187 @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey)
188 {
189 getPreferenceManager().setSharedPreferencesName(PREFS_NAME);
190 getPreferenceManager().setSharedPreferencesMode(MODE_PRIVATE);
191 setPreferencesFromResource(R.xml.bookmark_settings, rootKey);
192
193 Preference credPref = findPreference("bookmark.credentials");
194 if (credPref != null)
195 {
196 credPref.setSummaryProvider(preference -> {
197 SharedPreferences sp = getPreferenceManager().getSharedPreferences();
198 String username = sp.getString("bookmark.username", "<none>");
199 String domain = sp.getString("bookmark.domain", "");
200
201 if (username.isEmpty())
202 return "<none>";
203
204 if (!domain.isEmpty())
205 return domain + "\\" + username;
206
207 return username;
208 });
209 }
210
211 Preference screenPref = findPreference("bookmark.screen");
212 if (screenPref != null)
213 {
214 screenPref.setSummaryProvider(preference -> {
215 SharedPreferences sp = getPreferenceManager().getSharedPreferences();
216 String res = sp.getString("bookmark.resolution", "800x600");
217 if ("automatic".equals(res))
218 res = getString(R.string.resolution_automatic);
219 else if ("custom".equals(res))
220 res = getString(R.string.resolution_custom);
221 else if ("fitscreen".equals(res))
222 res = getString(R.string.resolution_fit);
223 int colors = sp.getInt("bookmark.colors", 16);
224 return res + "@" + colors;
225 });
226 }
227 }
228 }
229
230 // -------------------------------------------------------------------------
231
232 public static class CredentialsFragment extends PreferenceFragmentCompat
233 {
234 @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey)
235 {
236 getPreferenceManager().setSharedPreferencesName(PREFS_NAME);
237 getPreferenceManager().setSharedPreferencesMode(MODE_PRIVATE);
238 setPreferencesFromResource(R.xml.credentials_settings, rootKey);
239
240 Preference passwordPref = findPreference("bookmark.password");
241 if (passwordPref != null)
242 {
243 passwordPref.setSummaryProvider(preference -> {
244 SharedPreferences sp = getPreferenceManager().getSharedPreferences();
245 String pwd = sp.getString("bookmark.password", "");
246 return pwd.isEmpty() ? getString(R.string.settings_password_empty)
247 : getString(R.string.settings_password_present);
248 });
249 }
250 }
251 }
252
253 // -------------------------------------------------------------------------
254
255 public static class ScreenFragment extends PreferenceFragmentCompat
256 {
257 @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey)
258 {
259 getPreferenceManager().setSharedPreferencesName(PREFS_NAME);
260 getPreferenceManager().setSharedPreferencesMode(MODE_PRIVATE);
261 setPreferencesFromResource(R.xml.screen_settings, rootKey);
262 applyInitialScreenState();
263 setIntSummaryProvider();
264 }
265
266 @Override public void onStart()
267 {
268 super.onStart();
269 Preference res = findPreference("bookmark.resolution");
270 if (res != null)
271 {
272 res.setOnPreferenceChangeListener((pref, newValue) -> {
273 boolean custom = "custom".equalsIgnoreCase((String)newValue);
274 setEnabled("bookmark.width", custom);
275 setEnabled("bookmark.height", custom);
276 return true;
277 });
278 }
279 Preference scale = findPreference("bookmark.scale_mode");
280 if (scale != null)
281 {
282 scale.setOnPreferenceChangeListener((pref, newValue) -> {
283 boolean custom = "custom".equalsIgnoreCase((String)newValue);
284 setEnabled("bookmark.scale_desktop", custom);
285 setEnabled("bookmark.scale_device", custom);
286 return true;
287 });
288 }
289 }
290
291 private void applyInitialScreenState()
292 {
293 SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
294 boolean custom = "custom".equalsIgnoreCase(prefs.getString("bookmark.resolution", ""));
295 setEnabled("bookmark.width", custom);
296 setEnabled("bookmark.height", custom);
297
298 custom = "custom".equalsIgnoreCase(prefs.getString("bookmark.scale_mode", ""));
299 setEnabled("bookmark.scale_desktop", custom);
300 setEnabled("bookmark.scale_device", custom);
301 }
302
303 private void setEnabled(String key, boolean enabled)
304 {
305 Preference p = findPreference(key);
306 if (p != null)
307 p.setEnabled(enabled);
308 }
309
310 private void setIntSummaryProvider()
311 {
312 Preference resPref = findPreference("bookmark.resolution");
313 if (resPref != null)
314 {
315 resPref.setSummaryProvider(preference -> {
316 SharedPreferences sp = getPreferenceManager().getSharedPreferences();
317 String res = sp.getString("bookmark.resolution", "800x600");
318 if ("automatic".equals(res))
319 return getString(R.string.resolution_automatic);
320 if ("custom".equals(res))
321 return getString(R.string.resolution_custom);
322 if ("fitscreen".equals(res))
323 return getString(R.string.resolution_fit);
324 return res;
325 });
326 }
327
328 Preference scaleDesktopPref = findPreference("bookmark.scale_desktop");
329 if (scaleDesktopPref != null)
330 {
331 scaleDesktopPref.setSummaryProvider(preference -> {
332 SharedPreferences sp = getPreferenceManager().getSharedPreferences();
333 return sp.getInt("bookmark.scale_desktop", 100) + "%";
334 });
335 }
336 }
337 }
338
339 // -------------------------------------------------------------------------
340
341 public static class PerformanceFragment extends PreferenceFragmentCompat
342 {
343 @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey)
344 {
345 getPreferenceManager().setSharedPreferencesName(PREFS_NAME);
346 getPreferenceManager().setSharedPreferencesMode(MODE_PRIVATE);
347 setPreferencesFromResource(R.xml.performance_flags, rootKey);
348 if (!LibFreeRDP.hasH264Support())
349 {
350 Preference p = findPreference(getString(R.string.preference_key_h264));
351 if (p != null)
352 p.setEnabled(false);
353 }
354 }
355 }
356
357 // -------------------------------------------------------------------------
358
359 public static class AdvancedFragment extends PreferenceFragmentCompat
360 {
361 @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey)
362 {
363 getPreferenceManager().setSharedPreferencesName(PREFS_NAME);
364 getPreferenceManager().setSharedPreferencesMode(MODE_PRIVATE);
365 setPreferencesFromResource(R.xml.advanced_settings, rootKey);
366
367 SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
368
369 // Apply initial enabled states based on saved checkbox values.
370 setEnabled("bookmark.gateway_settings",
371 prefs.getBoolean("bookmark.enable_gateway_settings", false));
372 setEnabled("bookmark.vmconnect_guid",
373 prefs.getBoolean("bookmark.vmconnect_mode", false));
374
375 // Hide gateway section for non-manual bookmarks.
377 new ViewModelProvider(requireActivity()).get(BookmarkViewModel.class);
378 BookmarkBase bookmark = vm.getBookmark();
379 if (bookmark != null && bookmark.getType() != BookmarkBase.TYPE_MANUAL)
380 {
381 PreferenceScreen screen = getPreferenceScreen();
382 removeIfPresent(screen, "bookmark.enable_gateway_settings");
383 removeIfPresent(screen, "bookmark.gateway_settings");
384 }
385 }
386
387 @Override public void onStart()
388 {
389 super.onStart();
390
391 Preference gwCheck = findPreference("bookmark.enable_gateway_settings");
392 if (gwCheck != null)
393 {
394 gwCheck.setOnPreferenceChangeListener((pref, newValue) -> {
395 setEnabled("bookmark.gateway_settings", (Boolean)newValue);
396 return true;
397 });
398 }
399
400 Preference vmCheck = findPreference("bookmark.vmconnect_mode");
401 if (vmCheck != null)
402 {
403 vmCheck.setOnPreferenceChangeListener((pref, newValue) -> {
404 setEnabled("bookmark.vmconnect_guid", (Boolean)newValue);
405 return true;
406 });
407 }
408 }
409
410 private void setEnabled(String key, boolean enabled)
411 {
412 Preference p = findPreference(key);
413 if (p != null)
414 p.setEnabled(enabled);
415 }
416
417 private void removeIfPresent(PreferenceScreen screen, String key)
418 {
419 Preference p = findPreference(key);
420 if (p != null)
421 screen.removePreference(p);
422 }
423 }
424
425 // -------------------------------------------------------------------------
426
427 public static class GatewayFragment extends PreferenceFragmentCompat
428 {
429 @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey)
430 {
431 getPreferenceManager().setSharedPreferencesName(PREFS_NAME);
432 getPreferenceManager().setSharedPreferencesMode(MODE_PRIVATE);
433 setPreferencesFromResource(R.xml.gateway_settings, rootKey);
434 }
435 }
436
437 // -------------------------------------------------------------------------
438
439 public static class DebugFragment extends PreferenceFragmentCompat
440 {
441 @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey)
442 {
443 getPreferenceManager().setSharedPreferencesName(PREFS_NAME);
444 getPreferenceManager().setSharedPreferencesMode(MODE_PRIVATE);
445 setPreferencesFromResource(R.xml.debug_settings, rootKey);
446 }
447 }
448}