Mercurial > 510Connectbot
annotate src/com/five_ten_sg/connectbot/HostListActivity.java @ 192:f0b9ea35711a
read deployment.connections on startup for global preferences also
author | Carl Byington <carl@five-ten-sg.com> |
---|---|
date | Wed, 02 Jul 2014 18:06:59 -0700 |
parents | 398503d13f35 |
children | 8f0cdfc63378 |
rev | line source |
---|---|
0 | 1 /* |
2 * ConnectBot: simple, powerful, open-source SSH client for Android | |
3 * Copyright 2007 Kenny Root, Jeffrey Sharkey | |
4 * | |
5 * Licensed under the Apache License, Version 2.0 (the "License"); | |
6 * you may not use this file except in compliance with the License. | |
7 * You may obtain a copy of the License at | |
8 * | |
9 * http://www.apache.org/licenses/LICENSE-2.0 | |
10 * | |
11 * Unless required by applicable law or agreed to in writing, software | |
12 * distributed under the License is distributed on an "AS IS" BASIS, | |
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
14 * See the License for the specific language governing permissions and | |
15 * limitations under the License. | |
16 */ | |
17 | |
18 package com.five_ten_sg.connectbot; | |
19 | |
20 | |
21 import com.five_ten_sg.connectbot.bean.HostBean; | |
22 import com.five_ten_sg.connectbot.service.TerminalBridge; | |
23 import com.five_ten_sg.connectbot.service.TerminalManager; | |
24 import com.five_ten_sg.connectbot.transport.TransportFactory; | |
25 import com.five_ten_sg.connectbot.util.HostDatabase; | |
26 import com.five_ten_sg.connectbot.util.PreferenceConstants; | |
135
e251b3b679c3
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
134
diff
changeset
|
27 |
e251b3b679c3
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
134
diff
changeset
|
28 import java.io.BufferedReader; |
136
398503d13f35
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
135
diff
changeset
|
29 import java.io.FileReader; |
134
81cafbe7cd9b
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
132
diff
changeset
|
30 import java.io.File; |
135
e251b3b679c3
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
134
diff
changeset
|
31 import java.util.List; |
e251b3b679c3
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
134
diff
changeset
|
32 |
0 | 33 import android.app.Activity; |
34 import android.app.AlertDialog; | |
35 import android.app.ListActivity; | |
36 import android.content.ComponentName; | |
135
e251b3b679c3
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
134
diff
changeset
|
37 import android.content.ContentValues; |
0 | 38 import android.content.Context; |
39 import android.content.DialogInterface; | |
40 import android.content.Intent; | |
41 import android.content.Intent.ShortcutIconResource; | |
42 import android.content.ServiceConnection; | |
43 import android.content.SharedPreferences; | |
44 import android.content.SharedPreferences.Editor; | |
45 import android.content.res.ColorStateList; | |
135
e251b3b679c3
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
134
diff
changeset
|
46 import android.database.sqlite.SQLiteDatabase; |
0 | 47 import android.net.Uri; |
48 import android.os.Build; | |
49 import android.os.Bundle; | |
132
265a4733edcb
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
112
diff
changeset
|
50 import android.os.Environment; |
0 | 51 import android.os.Handler; |
52 import android.os.IBinder; | |
53 import android.os.Message; | |
54 import android.preference.PreferenceManager; | |
55 import android.util.Log; | |
56 import android.view.ContextMenu; | |
57 import android.view.KeyEvent; | |
58 import android.view.LayoutInflater; | |
59 import android.view.Menu; | |
60 import android.view.MenuItem; | |
61 import android.view.MenuItem.OnMenuItemClickListener; | |
62 import android.view.View; | |
63 import android.view.View.OnKeyListener; | |
64 import android.view.ViewGroup; | |
65 import android.widget.AdapterView; | |
66 import android.widget.AdapterView.OnItemClickListener; | |
67 import android.widget.ArrayAdapter; | |
68 import android.widget.ImageView; | |
69 import android.widget.ListView; | |
70 import android.widget.Spinner; | |
71 import android.widget.TextView; | |
72 | |
73 public class HostListActivity extends ListActivity { | |
134
81cafbe7cd9b
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
132
diff
changeset
|
74 protected static final String TAG = "ConnectBot.HostListActivity"; |
0 | 75 public final static int REQUEST_EDIT = 1; |
76 public final static int REQUEST_EULA = 2; | |
77 | |
78 protected TerminalManager bound = null; | |
79 | |
80 protected HostDatabase hostdb; | |
81 private List<HostBean> hosts; | |
82 protected LayoutInflater inflater = null; | |
83 | |
84 protected boolean sortedByColor = false; | |
85 | |
86 private MenuItem sortcolor; | |
87 | |
88 private MenuItem sortlast; | |
89 | |
90 private Spinner transportSpinner; | |
91 private TextView quickconnect; | |
92 | |
93 private SharedPreferences prefs = null; | |
94 | |
95 protected boolean makingShortcut = false; | |
96 | |
97 protected Handler updateHandler = new Handler() { | |
98 @Override | |
99 public void handleMessage(Message msg) { | |
100 HostListActivity.this.updateList(); | |
101 } | |
102 }; | |
103 | |
104 private ServiceConnection connection = new ServiceConnection() { | |
105 public void onServiceConnected(ComponentName className, IBinder service) { | |
106 bound = ((TerminalManager.TerminalBinder) service).getService(); | |
107 // update our listview binder to find the service | |
34
75d86b7fd3f0
make hostlist and pubkeylist consistent
Carl Byington <carl@five-ten-sg.com>
parents:
0
diff
changeset
|
108 updateList(); |
0 | 109 } |
110 public void onServiceDisconnected(ComponentName className) { | |
111 bound = null; | |
34
75d86b7fd3f0
make hostlist and pubkeylist consistent
Carl Byington <carl@five-ten-sg.com>
parents:
0
diff
changeset
|
112 updateList(); |
0 | 113 } |
114 }; | |
115 | |
116 @Override | |
117 public void onStart() { | |
118 super.onStart(); | |
119 // start the terminal manager service | |
120 this.bindService(new Intent(this, TerminalManager.class), connection, Context.BIND_AUTO_CREATE); | |
121 | |
122 if (this.hostdb == null) | |
123 this.hostdb = new HostDatabase(this); | |
124 } | |
125 | |
126 @Override | |
127 public void onStop() { | |
128 super.onStop(); | |
129 this.unbindService(connection); | |
130 | |
131 if (this.hostdb != null) { | |
132 this.hostdb.close(); | |
133 this.hostdb = null; | |
134 } | |
135 } | |
136 | |
137 @Override | |
138 public void onResume() { | |
139 super.onResume(); | |
140 } | |
141 | |
142 @Override | |
143 protected void onActivityResult(int requestCode, int resultCode, Intent data) { | |
144 if (requestCode == REQUEST_EULA) { | |
145 if (resultCode == Activity.RESULT_OK) { | |
146 // yay they agreed, so store that info | |
147 Editor edit = prefs.edit(); | |
148 edit.putBoolean(PreferenceConstants.EULA, true); | |
149 edit.commit(); | |
150 } | |
151 else { | |
152 // user didnt agree, so close | |
153 this.finish(); | |
154 } | |
155 } | |
156 else if (requestCode == REQUEST_EDIT) { | |
34
75d86b7fd3f0
make hostlist and pubkeylist consistent
Carl Byington <carl@five-ten-sg.com>
parents:
0
diff
changeset
|
157 updateList(); |
0 | 158 } |
159 } | |
160 | |
161 @Override | |
162 public void onCreate(Bundle icicle) { | |
163 super.onCreate(icicle); | |
164 setContentView(R.layout.act_hostlist); | |
165 this.setTitle(String.format("%s: %s", | |
166 getResources().getText(R.string.app_name), | |
167 getResources().getText(R.string.title_hosts_list))); | |
168 this.prefs = PreferenceManager.getDefaultSharedPreferences(this); | |
169 | |
170 // detect HTC Dream and apply special preferences | |
171 if (Build.MANUFACTURER.equals("HTC") && Build.DEVICE.equals("dream")) { | |
172 if (!prefs.contains(PreferenceConstants.SHIFT_FKEYS) && | |
173 !prefs.contains(PreferenceConstants.CTRL_FKEYS)) { | |
174 SharedPreferences.Editor editor = prefs.edit(); | |
175 editor.putBoolean(PreferenceConstants.SHIFT_FKEYS, true); | |
176 editor.putBoolean(PreferenceConstants.CTRL_FKEYS, true); | |
177 editor.commit(); | |
178 } | |
179 } | |
180 | |
181 // check for eula agreement | |
182 boolean agreed = prefs.getBoolean(PreferenceConstants.EULA, false); | |
183 | |
184 if (!agreed) { | |
34
75d86b7fd3f0
make hostlist and pubkeylist consistent
Carl Byington <carl@five-ten-sg.com>
parents:
0
diff
changeset
|
185 startActivityForResult(new Intent(this, WizardActivity.class), REQUEST_EULA); |
0 | 186 } |
187 | |
34
75d86b7fd3f0
make hostlist and pubkeylist consistent
Carl Byington <carl@five-ten-sg.com>
parents:
0
diff
changeset
|
188 makingShortcut = Intent.ACTION_CREATE_SHORTCUT.equals(getIntent().getAction()) |
112
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
35
diff
changeset
|
189 || Intent.ACTION_PICK.equals(getIntent().getAction()); |
0 | 190 // connect with hosts database and populate list |
34
75d86b7fd3f0
make hostlist and pubkeylist consistent
Carl Byington <carl@five-ten-sg.com>
parents:
0
diff
changeset
|
191 hostdb = new HostDatabase(this); |
132
265a4733edcb
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
112
diff
changeset
|
192 createDeploymentHosts(); // build hosts from a deployment text file |
34
75d86b7fd3f0
make hostlist and pubkeylist consistent
Carl Byington <carl@five-ten-sg.com>
parents:
0
diff
changeset
|
193 updateList(); |
75d86b7fd3f0
make hostlist and pubkeylist consistent
Carl Byington <carl@five-ten-sg.com>
parents:
0
diff
changeset
|
194 sortedByColor = prefs.getBoolean(PreferenceConstants.SORT_BY_COLOR, false); |
75d86b7fd3f0
make hostlist and pubkeylist consistent
Carl Byington <carl@five-ten-sg.com>
parents:
0
diff
changeset
|
195 registerForContextMenu(getListView()); |
75d86b7fd3f0
make hostlist and pubkeylist consistent
Carl Byington <carl@five-ten-sg.com>
parents:
0
diff
changeset
|
196 getListView().setOnItemClickListener(new OnItemClickListener() { |
112
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
35
diff
changeset
|
197 |
0 | 198 public synchronized void onItemClick(AdapterView<?> parent, View view, int position, long id) { |
199 // launch off to console details | |
34
75d86b7fd3f0
make hostlist and pubkeylist consistent
Carl Byington <carl@five-ten-sg.com>
parents:
0
diff
changeset
|
200 HostBean host = (HostBean) getListView().getItemAtPosition(position); |
0 | 201 Uri uri = host.getUri(); |
202 Intent contents = new Intent(Intent.ACTION_VIEW, uri); | |
203 contents.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); | |
204 | |
205 if (makingShortcut) { | |
206 // create shortcut if requested | |
207 ShortcutIconResource icon = Intent.ShortcutIconResource.fromContext(HostListActivity.this, R.drawable.icon); | |
208 Intent intent = new Intent(); | |
209 intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, contents); | |
210 intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, host.getNickname()); | |
211 intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon); | |
212 setResult(RESULT_OK, intent); | |
213 finish(); | |
214 } | |
215 else { | |
216 // otherwise just launch activity to show this host | |
34
75d86b7fd3f0
make hostlist and pubkeylist consistent
Carl Byington <carl@five-ten-sg.com>
parents:
0
diff
changeset
|
217 startActivity(contents); |
0 | 218 } |
219 } | |
220 }); | |
221 quickconnect = (TextView) this.findViewById(R.id.front_quickconnect); | |
222 quickconnect.setVisibility(makingShortcut ? View.GONE : View.VISIBLE); | |
223 quickconnect.setOnKeyListener(new OnKeyListener() { | |
224 public boolean onKey(View v, int keyCode, KeyEvent event) { | |
225 if (event.getAction() == KeyEvent.ACTION_UP) return false; | |
226 | |
227 if (keyCode != KeyEvent.KEYCODE_ENTER) return false; | |
228 | |
229 return startConsoleActivity(); | |
230 } | |
231 }); | |
232 transportSpinner = (Spinner)findViewById(R.id.transport_selection); | |
233 transportSpinner.setVisibility(makingShortcut ? View.GONE : View.VISIBLE); | |
234 ArrayAdapter<String> transportSelection = new ArrayAdapter<String> (this, | |
235 android.R.layout.simple_spinner_item, TransportFactory.getTransportNames()); | |
236 transportSelection.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); | |
237 transportSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { | |
238 public void onItemSelected(AdapterView<?> arg0, View view, int position, long id) { | |
239 String formatHint = TransportFactory.getFormatHint( | |
240 (String) transportSpinner.getSelectedItem(), | |
241 HostListActivity.this); | |
242 quickconnect.setHint(formatHint); | |
243 quickconnect.setError(null); | |
244 quickconnect.requestFocus(); | |
245 } | |
246 public void onNothingSelected(AdapterView<?> arg0) { } | |
247 }); | |
248 transportSpinner.setAdapter(transportSelection); | |
249 this.inflater = LayoutInflater.from(this); | |
250 } | |
251 | |
252 @Override | |
253 public boolean onPrepareOptionsMenu(Menu menu) { | |
254 super.onPrepareOptionsMenu(menu); | |
255 | |
256 // don't offer menus when creating shortcut | |
257 if (makingShortcut) return true; | |
258 | |
259 sortcolor.setVisible(!sortedByColor); | |
260 sortlast.setVisible(sortedByColor); | |
261 return true; | |
262 } | |
263 | |
264 @Override | |
265 public boolean onCreateOptionsMenu(Menu menu) { | |
266 super.onCreateOptionsMenu(menu); | |
267 | |
268 // don't offer menus when creating shortcut | |
269 if (makingShortcut) return true; | |
270 | |
271 // add host, ssh keys, about | |
272 sortcolor = menu.add(R.string.list_menu_sortcolor); | |
273 sortcolor.setIcon(android.R.drawable.ic_menu_share); | |
274 sortcolor.setOnMenuItemClickListener(new OnMenuItemClickListener() { | |
275 public boolean onMenuItemClick(MenuItem item) { | |
276 sortedByColor = true; | |
277 updateList(); | |
278 return true; | |
279 } | |
280 }); | |
281 sortlast = menu.add(R.string.list_menu_sortname); | |
282 sortlast.setIcon(android.R.drawable.ic_menu_share); | |
283 sortlast.setOnMenuItemClickListener(new OnMenuItemClickListener() { | |
284 public boolean onMenuItemClick(MenuItem item) { | |
285 sortedByColor = false; | |
286 updateList(); | |
287 return true; | |
288 } | |
289 }); | |
290 MenuItem keys = menu.add(R.string.list_menu_pubkeys); | |
291 keys.setIcon(android.R.drawable.ic_lock_lock); | |
292 keys.setIntent(new Intent(HostListActivity.this, PubkeyListActivity.class)); | |
293 MenuItem colors = menu.add(R.string.title_colors); | |
294 colors.setIcon(android.R.drawable.ic_menu_slideshow); | |
295 colors.setIntent(new Intent(HostListActivity.this, ColorsActivity.class)); | |
296 MenuItem settings = menu.add(R.string.list_menu_settings); | |
297 settings.setIcon(android.R.drawable.ic_menu_preferences); | |
298 settings.setIntent(new Intent(HostListActivity.this, SettingsActivity.class)); | |
299 MenuItem help = menu.add(R.string.title_help); | |
300 help.setIcon(android.R.drawable.ic_menu_help); | |
301 help.setIntent(new Intent(HostListActivity.this, HelpActivity.class)); | |
302 return true; | |
303 } | |
304 | |
305 | |
306 @Override | |
307 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { | |
308 // create menu to handle hosts | |
309 // create menu to handle deleting and sharing lists | |
310 AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo; | |
311 final HostBean host = (HostBean) this.getListView().getItemAtPosition(info.position); | |
312 menu.setHeaderTitle(host.getNickname()); | |
313 // edit, disconnect, delete | |
314 MenuItem connect = menu.add(R.string.list_host_disconnect); | |
315 final TerminalBridge bridge = bound.getConnectedBridge(host); | |
316 connect.setEnabled((bridge != null)); | |
317 connect.setOnMenuItemClickListener(new OnMenuItemClickListener() { | |
318 public boolean onMenuItemClick(MenuItem item) { | |
319 bridge.dispatchDisconnect(true); | |
320 updateHandler.sendEmptyMessage(-1); | |
321 return true; | |
322 } | |
323 }); | |
324 MenuItem edit = menu.add(R.string.list_host_edit); | |
325 edit.setOnMenuItemClickListener(new OnMenuItemClickListener() { | |
326 public boolean onMenuItemClick(MenuItem item) { | |
327 Intent intent = new Intent(HostListActivity.this, HostEditorActivity.class); | |
328 intent.putExtra(Intent.EXTRA_TITLE, host.getId()); | |
329 HostListActivity.this.startActivityForResult(intent, REQUEST_EDIT); | |
330 return true; | |
331 } | |
332 }); | |
333 MenuItem portForwards = menu.add(R.string.list_host_portforwards); | |
334 portForwards.setOnMenuItemClickListener(new OnMenuItemClickListener() { | |
335 public boolean onMenuItemClick(MenuItem item) { | |
336 Intent intent = new Intent(HostListActivity.this, PortForwardListActivity.class); | |
337 intent.putExtra(Intent.EXTRA_TITLE, host.getId()); | |
338 HostListActivity.this.startActivityForResult(intent, REQUEST_EDIT); | |
339 return true; | |
340 } | |
341 }); | |
342 | |
343 if (!TransportFactory.canForwardPorts(host.getProtocol())) | |
344 portForwards.setEnabled(false); | |
345 | |
346 MenuItem delete = menu.add(R.string.list_host_delete); | |
347 delete.setOnMenuItemClickListener(new OnMenuItemClickListener() { | |
348 public boolean onMenuItemClick(MenuItem item) { | |
349 // prompt user to make sure they really want this | |
350 new AlertDialog.Builder(HostListActivity.this) | |
351 .setMessage(getString(R.string.delete_message, host.getNickname())) | |
352 .setPositiveButton(R.string.delete_pos, new DialogInterface.OnClickListener() { | |
353 public void onClick(DialogInterface dialog, int which) { | |
354 // make sure we disconnect | |
355 if (bridge != null) | |
356 bridge.dispatchDisconnect(true); | |
357 | |
358 hostdb.deleteHost(host); | |
359 updateHandler.sendEmptyMessage(-1); | |
360 } | |
361 }) | |
362 .setNegativeButton(R.string.delete_neg, null).create().show(); | |
363 return true; | |
364 } | |
365 }); | |
366 } | |
367 | |
368 /** | |
369 * @param text | |
370 * @return | |
371 */ | |
372 private boolean startConsoleActivity() { | |
373 Uri uri = TransportFactory.getUri((String) transportSpinner | |
374 .getSelectedItem(), quickconnect.getText().toString()); | |
375 | |
376 if (uri == null) { | |
377 quickconnect.setError(getString(R.string.list_format_error, | |
378 TransportFactory.getFormatHint( | |
379 (String) transportSpinner.getSelectedItem(), | |
380 HostListActivity.this))); | |
381 return false; | |
382 } | |
383 | |
384 HostBean host = TransportFactory.findHost(hostdb, uri); | |
385 | |
386 if (host == null) { | |
387 host = TransportFactory.getTransport(uri.getScheme()).createHost(uri); | |
388 host.setColor(HostDatabase.COLOR_GRAY); | |
389 host.setPubkeyId(HostDatabase.PUBKEYID_ANY); | |
390 hostdb.saveHost(host); | |
391 } | |
392 | |
393 Intent intent = new Intent(HostListActivity.this, ConsoleActivity.class); | |
394 intent.setData(uri); | |
395 startActivity(intent); | |
396 return true; | |
397 } | |
398 | |
132
265a4733edcb
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
112
diff
changeset
|
399 private void createDeploymentHosts() { |
265a4733edcb
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
112
diff
changeset
|
400 try { |
265a4733edcb
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
112
diff
changeset
|
401 String fn = Environment.getExternalStorageDirectory().getAbsolutePath() + |
265a4733edcb
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
112
diff
changeset
|
402 File.separator + "deployment.connections"; |
265a4733edcb
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
112
diff
changeset
|
403 BufferedReader reader = new BufferedReader(new FileReader(fn)); |
265a4733edcb
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
112
diff
changeset
|
404 String line = null; |
265a4733edcb
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
112
diff
changeset
|
405 while ((line = reader.readLine()) != null) { |
265a4733edcb
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
112
diff
changeset
|
406 if (line.length() == 0) continue; // empty |
265a4733edcb
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
112
diff
changeset
|
407 if (line.substring(0,1).equals("#")) continue; // comment |
265a4733edcb
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
112
diff
changeset
|
408 if (!line.contains("://")) continue; // invalid uri |
265a4733edcb
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
112
diff
changeset
|
409 Uri uri = Uri.parse(line); |
265a4733edcb
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
112
diff
changeset
|
410 ContentValues values = null; |
265a4733edcb
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
112
diff
changeset
|
411 while ((line = reader.readLine()).length() > 0) { |
265a4733edcb
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
112
diff
changeset
|
412 String [] parts = line.split("="); |
135
e251b3b679c3
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
134
diff
changeset
|
413 if (parts.length != 2) continue; |
132
265a4733edcb
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
112
diff
changeset
|
414 if (values == null) values = new ContentValues(); |
265a4733edcb
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
112
diff
changeset
|
415 values.put(parts[0], parts[1]); |
265a4733edcb
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
112
diff
changeset
|
416 } |
192
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
417 if (uri.getScheme().equals("global")) { |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
418 SharedPreferences.Editor editor = prefs.edit(); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
419 HashMap<String,String> types = new HashMap<String,String>(); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
420 types.put("memkeys", "boolean"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
421 types.put("update", "string"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
422 types.put("connPersist", "boolean"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
423 types.put("emulation", "string"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
424 types.put("scrollback", "integer"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
425 types.put("rotation", "string"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
426 types.put("shiftfkeys", "boolean"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
427 types.put("ctrlfkeys", "boolean"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
428 types.put("volumefont", "boolean"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
429 types.put("keymode", "string"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
430 types.put("camera", "string"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
431 types.put("volup", "string"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
432 types.put("voldn", "string"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
433 types.put("search", "string"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
434 types.put("ptt", "string"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
435 types.put("keepalive", "boolean"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
436 types.put("wifilock", "boolean"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
437 types.put("bumpyarrows", "boolean"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
438 types.put("extended_longpress", "boolean"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
439 types.put("ctrl_string", "string"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
440 types.put("picker_string", "string"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
441 types.put("picker_keep_open", "boolean"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
442 types.put("list_custom_keymap", "string"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
443 types.put("bell", "boolean"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
444 types.put("bellVolume", "float"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
445 types.put("bellVibrate", "boolean"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
446 types.put("bellNotification", "boolean"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
447 types.put("default_font_size", "float"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
448 types.put("default_fsize_width", "integer"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
449 types.put("default_fsize_height", "integer"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
450 types.put("screen_capture_folder", "string"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
451 types.put("screen_capture_popup", "boolean"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
452 types.put("file_dialog", "string"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
453 types.put("download_folder", "string"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
454 types.put("remote_upload_folder", "string"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
455 types.put("upload_dest_prompt", "boolean"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
456 types.put("background_file_transfer", "boolean"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
457 types.put("debug_keycodes", "boolean"); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
458 for (String key : values.keySet()) { |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
459 if (types.containsKey(key)) { |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
460 Char stype = types.get(key)[0]; |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
461 switch (stype) { |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
462 case 'b': |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
463 editor.putBoolean(values.getAsBoolean(key); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
464 break; |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
465 |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
466 case 'i': |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
467 editor.putInteger(values.getAsInteger(key)); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
468 break; |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
469 |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
470 case 'f': |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
471 editor.putFloat(values.getAsFloat(key)); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
472 break; |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
473 |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
474 case 's': |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
475 editor.putString(values.getAsString(key)) |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
476 break; |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
477 } |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
478 } |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
479 } |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
480 editor.commit(); |
132
265a4733edcb
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
112
diff
changeset
|
481 } |
192
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
482 else { |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
483 HostBean host = TransportFactory.findHost(hostdb, uri); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
484 if (host == null) { |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
485 host = TransportFactory.getTransport(uri.getScheme()).createHost(uri); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
486 host.setColor(HostDatabase.COLOR_GRAY); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
487 host.setPubkeyId(HostDatabase.PUBKEYID_ANY); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
488 hostdb.saveHost(host); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
489 } |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
490 host = TransportFactory.findHost(hostdb, uri); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
491 if (host == null) continue; |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
492 if (values == null) continue; |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
493 SQLiteDatabase db = hostdb.getWritableDatabase(); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
494 db.update(HostDatabase.TABLE_HOSTS, values, "_id = ?", new String[] { String.valueOf(host.getId()) }); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
495 db.close(); |
f0b9ea35711a
read deployment.connections on startup for global preferences also
Carl Byington <carl@five-ten-sg.com>
parents:
136
diff
changeset
|
496 } |
132
265a4733edcb
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
112
diff
changeset
|
497 } |
265a4733edcb
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
112
diff
changeset
|
498 reader.close(); |
135
e251b3b679c3
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
134
diff
changeset
|
499 (new File(fn)).delete(); |
132
265a4733edcb
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
112
diff
changeset
|
500 } |
265a4733edcb
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
112
diff
changeset
|
501 catch (Exception e) { |
265a4733edcb
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
112
diff
changeset
|
502 Log.d(TAG, "Deployment scan failed.", e); |
265a4733edcb
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
112
diff
changeset
|
503 } |
265a4733edcb
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
112
diff
changeset
|
504 } |
265a4733edcb
read deployment.connections on startup for new host entries
Carl Byington <carl@five-ten-sg.com>
parents:
112
diff
changeset
|
505 |
0 | 506 protected void updateList() { |
507 if (prefs.getBoolean(PreferenceConstants.SORT_BY_COLOR, false) != sortedByColor) { | |
508 Editor edit = prefs.edit(); | |
509 edit.putBoolean(PreferenceConstants.SORT_BY_COLOR, sortedByColor); | |
510 edit.commit(); | |
511 } | |
512 | |
513 if (hostdb == null) | |
514 hostdb = new HostDatabase(this); | |
515 | |
516 hosts = hostdb.getHosts(sortedByColor); | |
517 | |
518 // Don't lose hosts that are connected via shortcuts but not in the database. | |
519 if (bound != null) { | |
520 for (TerminalBridge bridge : bound.bridges) { | |
521 if (!hosts.contains(bridge.host)) | |
522 hosts.add(0, bridge.host); | |
523 } | |
524 } | |
525 | |
526 HostAdapter adapter = new HostAdapter(this, hosts, bound); | |
527 this.setListAdapter(adapter); | |
528 } | |
529 | |
530 class HostAdapter extends ArrayAdapter<HostBean> { | |
531 private List<HostBean> hosts; | |
532 private final TerminalManager manager; | |
533 private final ColorStateList red, green, blue; | |
534 | |
535 public final static int STATE_UNKNOWN = 1, STATE_CONNECTED = 2, STATE_DISCONNECTED = 3; | |
536 | |
537 class ViewHolder { | |
538 public TextView nickname; | |
539 public TextView caption; | |
540 public ImageView icon; | |
541 } | |
542 | |
543 public HostAdapter(Context context, List<HostBean> hosts, TerminalManager manager) { | |
544 super(context, R.layout.item_host, hosts); | |
545 this.hosts = hosts; | |
546 this.manager = manager; | |
547 red = context.getResources().getColorStateList(R.color.red); | |
548 green = context.getResources().getColorStateList(R.color.green); | |
549 blue = context.getResources().getColorStateList(R.color.blue); | |
550 } | |
551 | |
552 /** | |
553 * Check if we're connected to a terminal with the given host. | |
554 */ | |
555 private int getConnectedState(HostBean host) { | |
556 // always disconnected if we dont have backend service | |
557 if (this.manager == null) | |
558 return STATE_UNKNOWN; | |
559 | |
560 if (manager.getConnectedBridge(host) != null) | |
561 return STATE_CONNECTED; | |
562 | |
563 if (manager.disconnected.contains(host)) | |
564 return STATE_DISCONNECTED; | |
565 | |
566 return STATE_UNKNOWN; | |
567 } | |
568 | |
569 @Override | |
570 public View getView(int position, View convertView, ViewGroup parent) { | |
571 ViewHolder holder; | |
572 | |
573 if (convertView == null) { | |
574 convertView = inflater.inflate(R.layout.item_host, null, false); | |
575 holder = new ViewHolder(); | |
576 holder.nickname = (TextView)convertView.findViewById(android.R.id.text1); | |
577 holder.caption = (TextView)convertView.findViewById(android.R.id.text2); | |
578 holder.icon = (ImageView)convertView.findViewById(android.R.id.icon); | |
579 convertView.setTag(holder); | |
580 } | |
581 else | |
582 holder = (ViewHolder) convertView.getTag(); | |
583 | |
584 HostBean host = hosts.get(position); | |
585 | |
586 if (host == null) { | |
587 // Well, something bad happened. We can't continue. | |
588 Log.e("HostAdapter", "Host bean is null!"); | |
589 holder.nickname.setText("Error during lookup"); | |
590 holder.caption.setText("see 'adb logcat' for more"); | |
591 return convertView; | |
592 } | |
593 | |
594 holder.nickname.setText(host.getNickname()); | |
595 | |
596 switch (this.getConnectedState(host)) { | |
597 case STATE_UNKNOWN: | |
598 holder.icon.setImageState(new int[] { }, true); | |
599 break; | |
600 | |
601 case STATE_CONNECTED: | |
602 holder.icon.setImageState(new int[] { android.R.attr.state_checked }, true); | |
603 break; | |
604 | |
605 case STATE_DISCONNECTED: | |
606 holder.icon.setImageState(new int[] { android.R.attr.state_expanded }, true); | |
607 break; | |
608 } | |
609 | |
610 ColorStateList chosen = null; | |
611 | |
612 if (HostDatabase.COLOR_RED.equals(host.getColor())) | |
613 chosen = this.red; | |
614 else if (HostDatabase.COLOR_GREEN.equals(host.getColor())) | |
615 chosen = this.green; | |
616 else if (HostDatabase.COLOR_BLUE.equals(host.getColor())) | |
617 chosen = this.blue; | |
618 | |
619 Context context = convertView.getContext(); | |
620 | |
621 if (chosen != null) { | |
622 // set color normally if not selected | |
623 holder.nickname.setTextColor(chosen); | |
624 holder.caption.setTextColor(chosen); | |
625 } | |
626 else { | |
627 // selected, so revert back to default black text | |
628 holder.nickname.setTextAppearance(context, android.R.attr.textAppearanceLarge); | |
629 holder.caption.setTextAppearance(context, android.R.attr.textAppearanceSmall); | |
630 } | |
631 | |
632 long now = System.currentTimeMillis() / 1000; | |
633 String nice = context.getString(R.string.bind_never); | |
634 | |
635 if (host.getLastConnect() > 0) { | |
636 int minutes = (int)((now - host.getLastConnect()) / 60); | |
637 | |
638 if (minutes >= 60) { | |
639 int hours = (minutes / 60); | |
640 | |
641 if (hours >= 24) { | |
642 int days = (hours / 24); | |
643 nice = context.getString(R.string.bind_days, days); | |
644 } | |
645 else | |
646 nice = context.getString(R.string.bind_hours, hours); | |
647 } | |
648 else | |
649 nice = context.getString(R.string.bind_minutes, minutes); | |
650 } | |
651 | |
652 holder.caption.setText(nice); | |
653 return convertView; | |
654 } | |
655 } | |
656 } |