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 applyInitialResolutionState();
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 }
280
281 private void applyInitialResolutionState()
282 {
283 SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
284 boolean custom = "custom".equalsIgnoreCase(prefs.getString("bookmark.resolution", ""));
285 setEnabled("bookmark.width", custom);
286 setEnabled("bookmark.height", custom);
287 }
288
289 private void setEnabled(String key, boolean enabled)
290 {
291 Preference p = findPreference(key);
292 if (p != null)
293 p.setEnabled(enabled);
294 }
295
296 private void setIntSummaryProvider()
297 {
298 Preference resPref = findPreference("bookmark.resolution");
299 if (resPref != null)
300 {
301 resPref.setSummaryProvider(preference -> {
302 SharedPreferences sp = getPreferenceManager().getSharedPreferences();
303 String res = sp.getString("bookmark.resolution", "800x600");
304 if ("automatic".equals(res))
305 return getString(R.string.resolution_automatic);
306 if ("custom".equals(res))
307 return getString(R.string.resolution_custom);
308 if ("fitscreen".equals(res))
309 return getString(R.string.resolution_fit);
310 return res;
311 });
312 }
313 }
314 }
315
316 // -------------------------------------------------------------------------
317
318 public static class PerformanceFragment extends PreferenceFragmentCompat
319 {
320 @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey)
321 {
322 getPreferenceManager().setSharedPreferencesName(PREFS_NAME);
323 getPreferenceManager().setSharedPreferencesMode(MODE_PRIVATE);
324 setPreferencesFromResource(R.xml.performance_flags, rootKey);
325 if (!LibFreeRDP.hasH264Support())
326 {
327 Preference p = findPreference(getString(R.string.preference_key_h264));
328 if (p != null)
329 p.setEnabled(false);
330 }
331 }
332 }
333
334 // -------------------------------------------------------------------------
335
336 public static class AdvancedFragment extends PreferenceFragmentCompat
337 {
338 @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey)
339 {
340 getPreferenceManager().setSharedPreferencesName(PREFS_NAME);
341 getPreferenceManager().setSharedPreferencesMode(MODE_PRIVATE);
342 setPreferencesFromResource(R.xml.advanced_settings, rootKey);
343
344 SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
345
346 // Apply initial enabled states based on saved checkbox values.
347 setEnabled("bookmark.gateway_settings",
348 prefs.getBoolean("bookmark.enable_gateway_settings", false));
349
350 // Hide gateway section for non-manual bookmarks.
352 new ViewModelProvider(requireActivity()).get(BookmarkViewModel.class);
353 BookmarkBase bookmark = vm.getBookmark();
354 if (bookmark != null && bookmark.getType() != BookmarkBase.TYPE_MANUAL)
355 {
356 PreferenceScreen screen = getPreferenceScreen();
357 removeIfPresent(screen, "bookmark.enable_gateway_settings");
358 removeIfPresent(screen, "bookmark.gateway_settings");
359 }
360 }
361
362 @Override public void onStart()
363 {
364 super.onStart();
365
366 Preference gwCheck = findPreference("bookmark.enable_gateway_settings");
367 if (gwCheck != null)
368 {
369 gwCheck.setOnPreferenceChangeListener((pref, newValue) -> {
370 setEnabled("bookmark.gateway_settings", (Boolean)newValue);
371 return true;
372 });
373 }
374 }
375
376 private void setEnabled(String key, boolean enabled)
377 {
378 Preference p = findPreference(key);
379 if (p != null)
380 p.setEnabled(enabled);
381 }
382
383 private void removeIfPresent(PreferenceScreen screen, String key)
384 {
385 Preference p = findPreference(key);
386 if (p != null)
387 screen.removePreference(p);
388 }
389 }
390
391 // -------------------------------------------------------------------------
392
393 public static class GatewayFragment extends PreferenceFragmentCompat
394 {
395 @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey)
396 {
397 getPreferenceManager().setSharedPreferencesName(PREFS_NAME);
398 getPreferenceManager().setSharedPreferencesMode(MODE_PRIVATE);
399 setPreferencesFromResource(R.xml.gateway_settings, rootKey);
400 }
401 }
402
403 // -------------------------------------------------------------------------
404
405 public static class DebugFragment extends PreferenceFragmentCompat
406 {
407 @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey)
408 {
409 getPreferenceManager().setSharedPreferencesName(PREFS_NAME);
410 getPreferenceManager().setSharedPreferencesMode(MODE_PRIVATE);
411 setPreferencesFromResource(R.xml.debug_settings, rootKey);
412 }
413 }
414}