FreeRDP
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Modules Pages
HomeActivity.java
1/*
2 Main/Home 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.app.AlertDialog;
14import android.content.DialogInterface;
15import android.content.Intent;
16import android.content.res.Configuration;
17import android.net.Uri;
18import android.os.Bundle;
19import androidx.appcompat.app.AppCompatActivity;
20import android.text.Editable;
21import android.text.TextWatcher;
22import android.util.Log;
23import android.view.ContextMenu;
24import android.view.ContextMenu.ContextMenuInfo;
25import android.view.Menu;
26import android.view.MenuInflater;
27import android.view.MenuItem;
28import android.view.View;
29import android.view.View.OnClickListener;
30import android.view.View.OnCreateContextMenuListener;
31import android.widget.AdapterView;
32import android.widget.AdapterView.AdapterContextMenuInfo;
33import android.widget.Button;
34import android.widget.CheckBox;
35import android.widget.EditText;
36import android.widget.ListView;
37
38import com.freerdp.freerdpcore.R;
39import com.freerdp.freerdpcore.application.GlobalApp;
40import com.freerdp.freerdpcore.domain.BookmarkBase;
41import com.freerdp.freerdpcore.domain.ConnectionReference;
42import com.freerdp.freerdpcore.domain.PlaceholderBookmark;
43import com.freerdp.freerdpcore.domain.QuickConnectBookmark;
44import com.freerdp.freerdpcore.utils.BookmarkArrayAdapter;
45import com.freerdp.freerdpcore.utils.SeparatedListAdapter;
46
47import java.util.ArrayList;
48
49public class HomeActivity extends AppCompatActivity
50{
51 private final static String ADD_BOOKMARK_PLACEHOLDER = "add_bookmark";
52 private static final String TAG = "HomeActivity";
53 private static final String PARAM_SUPERBAR_TEXT = "superbar_text";
54 private ListView listViewBookmarks;
55 private Button clearTextButton;
56 private EditText superBarEditText;
57 private BookmarkArrayAdapter manualBookmarkAdapter;
58 private SeparatedListAdapter separatedListAdapter;
59 private PlaceholderBookmark addBookmarkPlaceholder;
60 private String sectionLabelBookmarks;
61
62 View mDecor;
63
64 @Override public void onCreate(Bundle savedInstanceState)
65 {
66 setTitle(R.string.title_home);
67 super.onCreate(savedInstanceState);
68 setContentView(R.layout.home);
69
70 mDecor = getWindow().getDecorView();
71 mDecor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
72 View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
73
74 long heapSize = Runtime.getRuntime().maxMemory();
75 Log.i(TAG, "Max HeapSize: " + heapSize);
76 Log.i(TAG, "App data folder: " + getFilesDir().toString());
77
78 // load strings
79 sectionLabelBookmarks = getResources().getString(R.string.section_bookmarks);
80
81 // create add bookmark/quick connect bookmark placeholder
82 addBookmarkPlaceholder = new PlaceholderBookmark();
83 addBookmarkPlaceholder.setName(ADD_BOOKMARK_PLACEHOLDER);
84 addBookmarkPlaceholder.setLabel(
85 getResources().getString(R.string.list_placeholder_add_bookmark));
86
87 // check for passed .rdp file and open it in a new bookmark
88 Intent caller = getIntent();
89 Uri callParameter = caller.getData();
90
91 if (Intent.ACTION_VIEW.equals(caller.getAction()) && callParameter != null)
92 {
93 String refStr = ConnectionReference.getFileReference(callParameter.getPath());
94 Bundle bundle = new Bundle();
95 bundle.putString(BookmarkActivity.PARAM_CONNECTION_REFERENCE, refStr);
96
97 Intent bookmarkIntent =
98 new Intent(this.getApplicationContext(), BookmarkActivity.class);
99 bookmarkIntent.putExtras(bundle);
100 startActivity(bookmarkIntent);
101 }
102
103 // load views
104 clearTextButton = findViewById(R.id.clear_search_btn);
105 superBarEditText = findViewById(R.id.superBarEditText);
106
107 listViewBookmarks = findViewById(R.id.listViewBookmarks);
108
109 // set listeners for the list view
110 listViewBookmarks.setOnItemClickListener(new AdapterView.OnItemClickListener() {
111 public void onItemClick(AdapterView<?> parent, View view, int position, long id)
112 {
113 String curSection = separatedListAdapter.getSectionForPosition(position);
114 Log.v(TAG, "Clicked on item id " + separatedListAdapter.getItemId(position) +
115 " in section " + curSection);
116 if (curSection.equals(sectionLabelBookmarks))
117 {
118 String refStr = view.getTag().toString();
119 if (ConnectionReference.isManualBookmarkReference(refStr) ||
120 ConnectionReference.isHostnameReference(refStr))
121 {
122 Bundle bundle = new Bundle();
123 bundle.putString(SessionActivity.PARAM_CONNECTION_REFERENCE, refStr);
124
125 Intent sessionIntent = new Intent(view.getContext(), SessionActivity.class);
126 sessionIntent.putExtras(bundle);
127 startActivity(sessionIntent);
128
129 // clear any search text
130 superBarEditText.setText("");
131 superBarEditText.clearFocus();
132 }
133 else if (ConnectionReference.isPlaceholderReference(refStr))
134 {
135 // is this the add bookmark placeholder?
136 if (ConnectionReference.getPlaceholder(refStr).equals(
137 ADD_BOOKMARK_PLACEHOLDER))
138 {
139 Intent bookmarkIntent =
140 new Intent(view.getContext(), BookmarkActivity.class);
141 startActivity(bookmarkIntent);
142 }
143 }
144 }
145 }
146 });
147
148 listViewBookmarks.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {
149 @Override
150 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
151 {
152 // if the selected item is not a session item (tag == null) and not a quick connect
153 // entry (not a hostname connection reference) inflate the context menu
154 View itemView = ((AdapterContextMenuInfo)menuInfo).targetView;
155 String refStr = itemView.getTag() != null ? itemView.getTag().toString() : null;
156 if (refStr != null && !ConnectionReference.isHostnameReference(refStr) &&
157 !ConnectionReference.isPlaceholderReference(refStr))
158 {
159 getMenuInflater().inflate(R.menu.bookmark_context_menu, menu);
160 menu.setHeaderTitle(getResources().getString(R.string.menu_title_bookmark));
161 }
162 }
163 });
164
165 superBarEditText.addTextChangedListener(new SuperBarTextWatcher());
166
167 clearTextButton.setOnClickListener(new OnClickListener() {
168 @Override public void onClick(View v)
169 {
170 superBarEditText.setText("");
171 }
172 });
173 }
174
175 @Override public void onConfigurationChanged(Configuration newConfig)
176 {
177 // ignore orientation/keyboard change
178 super.onConfigurationChanged(newConfig);
179 mDecor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
180 View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
181 }
182
183 @Override public boolean onSearchRequested()
184 {
185 superBarEditText.requestFocus();
186 return true;
187 }
188
189 @Override public boolean onContextItemSelected(MenuItem aItem)
190 {
191
192 // get connection reference
193 AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo)aItem.getMenuInfo();
194 String refStr = menuInfo.targetView.getTag().toString();
195
196 // refer to http://tools.android.com/tips/non-constant-fields why we can't use switch/case
197 // here ..
198 int itemId = aItem.getItemId();
199 if (itemId == R.id.bookmark_connect)
200 {
201 Bundle bundle = new Bundle();
202 bundle.putString(SessionActivity.PARAM_CONNECTION_REFERENCE, refStr);
203 Intent sessionIntent = new Intent(this, SessionActivity.class);
204 sessionIntent.putExtras(bundle);
205
206 startActivity(sessionIntent);
207 return true;
208 }
209 else if (itemId == R.id.bookmark_edit)
210 {
211 Bundle bundle = new Bundle();
212 bundle.putString(BookmarkActivity.PARAM_CONNECTION_REFERENCE, refStr);
213
214 Intent bookmarkIntent =
215 new Intent(this.getApplicationContext(), BookmarkActivity.class);
216 bookmarkIntent.putExtras(bundle);
217 startActivity(bookmarkIntent);
218 return true;
219 }
220 else if (itemId == R.id.bookmark_delete)
221 {
222 if (ConnectionReference.isManualBookmarkReference(refStr))
223 {
224 long id = ConnectionReference.getManualBookmarkId(refStr);
225 GlobalApp.getManualBookmarkGateway().delete(id);
226 manualBookmarkAdapter.remove(id);
227 separatedListAdapter.notifyDataSetChanged();
228 }
229 else
230 {
231 assert false;
232 }
233
234 // clear super bar text
235 superBarEditText.setText("");
236 return true;
237 }
238
239 return false;
240 }
241
242 @Override protected void onResume()
243 {
244 super.onResume();
245 Log.v(TAG, "HomeActivity.onResume");
246
247 // create bookmark cursor adapter
248 manualBookmarkAdapter = new BookmarkArrayAdapter(
249 this, R.layout.bookmark_list_item, GlobalApp.getManualBookmarkGateway().findAll());
250
251 // add add bookmark item to manual adapter
252 manualBookmarkAdapter.insert(addBookmarkPlaceholder, 0);
253
254 // attach all adapters to the separatedListView adapter and assign it to the list view
255 separatedListAdapter = new SeparatedListAdapter(this);
256 separatedListAdapter.addSection(sectionLabelBookmarks, manualBookmarkAdapter);
257 listViewBookmarks.setAdapter(separatedListAdapter);
258
259 // if we have a filter text entered cause an update to be caused here
260 String filter = superBarEditText.getText().toString();
261 if (filter.length() > 0)
262 superBarEditText.setText(filter);
263 }
264
265 @Override protected void onPause()
266 {
267 super.onPause();
268 Log.v(TAG, "HomeActivity.onPause");
269
270 // reset adapters
271 listViewBookmarks.setAdapter(null);
272 separatedListAdapter = null;
273 manualBookmarkAdapter = null;
274 }
275
276 @Override public void onBackPressed()
277 {
278 // if back was pressed - ask the user if he really wants to exit
279 if (ApplicationSettingsActivity.getAskOnExit(this))
280 {
281 final CheckBox cb = new CheckBox(this);
282 cb.setChecked(!ApplicationSettingsActivity.getAskOnExit(this));
283 cb.setText(R.string.dlg_dont_show_again);
284
285 AlertDialog.Builder builder = new AlertDialog.Builder(this);
286 builder.setTitle(R.string.dlg_title_exit)
287 .setMessage(R.string.dlg_msg_exit)
288 .setView(cb)
289 .setPositiveButton(R.string.yes,
290 new DialogInterface.OnClickListener() {
291 public void onClick(DialogInterface dialog, int which)
292 {
293 finish();
294 }
295 })
296 .setNegativeButton(R.string.no,
297 new DialogInterface.OnClickListener() {
298 public void onClick(DialogInterface dialog, int which)
299 {
300 dialog.dismiss();
301 }
302 })
303 .create()
304 .show();
305 }
306 else
307 {
308 super.onBackPressed();
309 }
310 }
311
312 @Override protected void onSaveInstanceState(Bundle outState)
313 {
314 super.onSaveInstanceState(outState);
315 outState.putString(PARAM_SUPERBAR_TEXT, superBarEditText.getText().toString());
316 }
317
318 @Override protected void onRestoreInstanceState(Bundle inState)
319 {
320 super.onRestoreInstanceState(inState);
321 superBarEditText.setText(inState.getString(PARAM_SUPERBAR_TEXT));
322 }
323
324 @Override public boolean onCreateOptionsMenu(Menu menu)
325 {
326 MenuInflater inflater = getMenuInflater();
327 inflater.inflate(R.menu.home_menu, menu);
328 return true;
329 }
330
331 @Override public boolean onOptionsItemSelected(MenuItem item)
332 {
333
334 // refer to http://tools.android.com/tips/non-constant-fields why we can't use switch/case
335 // here ..
336 int itemId = item.getItemId();
337 if (itemId == R.id.newBookmark)
338 {
339 Intent bookmarkIntent = new Intent(this, BookmarkActivity.class);
340 startActivity(bookmarkIntent);
341 }
342 else if (itemId == R.id.appSettings)
343 {
344 Intent settingsIntent = new Intent(this, ApplicationSettingsActivity.class);
345 startActivity(settingsIntent);
346 }
347 else if (itemId == R.id.help)
348 {
349 Intent helpIntent = new Intent(this, HelpActivity.class);
350 startActivity(helpIntent);
351 }
352 else if (itemId == R.id.about)
353 {
354 Intent aboutIntent = new Intent(this, AboutActivity.class);
355 startActivity(aboutIntent);
356 }
357
358 return true;
359 }
360
361 private class SuperBarTextWatcher implements TextWatcher
362 {
363 @Override public void afterTextChanged(Editable s)
364 {
365 if (separatedListAdapter != null)
366 {
367 String text = s.toString();
368 if (text.length() > 0)
369 {
370 ArrayList<BookmarkBase> computers_list =
371 GlobalApp.getQuickConnectHistoryGateway().findHistory(text);
372 computers_list.addAll(
373 GlobalApp.getManualBookmarkGateway().findByLabelOrHostnameLike(text));
374 manualBookmarkAdapter.replaceItems(computers_list);
375 QuickConnectBookmark qcBm = new QuickConnectBookmark();
376 qcBm.setLabel(text);
377 qcBm.setHostname(text);
378 manualBookmarkAdapter.insert(qcBm, 0);
379 }
380 else
381 {
382 manualBookmarkAdapter.replaceItems(
383 GlobalApp.getManualBookmarkGateway().findAll());
384 manualBookmarkAdapter.insert(addBookmarkPlaceholder, 0);
385 }
386
387 separatedListAdapter.notifyDataSetChanged();
388 }
389 }
390
391 @Override public void beforeTextChanged(CharSequence s, int start, int count, int after)
392 {
393 }
394
395 @Override public void onTextChanged(CharSequence s, int start, int before, int count)
396 {
397 }
398 }
399}