Mercurial > 510Connectbot
annotate src/com/five_ten_sg/connectbot/HostListActivity.java @ 112:77ac18bc1b2f
cleanup java formatting
author | Carl Byington <carl@five-ten-sg.com> |
---|---|
date | Wed, 18 Jun 2014 13:03:01 -0700 |
parents | 9925ea1aa279 |
children | 265a4733edcb |
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 import java.util.List; | |
21 | |
22 import com.five_ten_sg.connectbot.bean.HostBean; | |
23 import com.five_ten_sg.connectbot.service.TerminalBridge; | |
24 import com.five_ten_sg.connectbot.service.TerminalManager; | |
25 import com.five_ten_sg.connectbot.transport.TransportFactory; | |
26 import com.five_ten_sg.connectbot.util.HostDatabase; | |
27 import com.five_ten_sg.connectbot.util.PreferenceConstants; | |
28 import android.app.Activity; | |
29 import android.app.AlertDialog; | |
30 import android.app.ListActivity; | |
31 import android.content.ComponentName; | |
32 import android.content.Context; | |
33 import android.content.DialogInterface; | |
34 import android.content.Intent; | |
35 import android.content.Intent.ShortcutIconResource; | |
36 import android.content.ServiceConnection; | |
37 import android.content.SharedPreferences; | |
38 import android.content.SharedPreferences.Editor; | |
39 import android.content.res.ColorStateList; | |
40 import android.net.Uri; | |
41 import android.os.Build; | |
42 import android.os.Bundle; | |
43 import android.os.Handler; | |
44 import android.os.IBinder; | |
45 import android.os.Message; | |
46 import android.preference.PreferenceManager; | |
47 import android.util.Log; | |
48 import android.view.ContextMenu; | |
49 import android.view.KeyEvent; | |
50 import android.view.LayoutInflater; | |
51 import android.view.Menu; | |
52 import android.view.MenuItem; | |
53 import android.view.MenuItem.OnMenuItemClickListener; | |
54 import android.view.View; | |
55 import android.view.View.OnKeyListener; | |
56 import android.view.ViewGroup; | |
57 import android.widget.AdapterView; | |
58 import android.widget.AdapterView.OnItemClickListener; | |
59 import android.widget.ArrayAdapter; | |
60 import android.widget.ImageView; | |
61 import android.widget.ListView; | |
62 import android.widget.Spinner; | |
63 import android.widget.TextView; | |
64 | |
65 public class HostListActivity extends ListActivity { | |
66 public final static int REQUEST_EDIT = 1; | |
67 | |
68 public final static int REQUEST_EULA = 2; | |
69 | |
70 protected TerminalManager bound = null; | |
71 | |
72 protected HostDatabase hostdb; | |
73 private List<HostBean> hosts; | |
74 protected LayoutInflater inflater = null; | |
75 | |
76 protected boolean sortedByColor = false; | |
77 | |
78 private MenuItem sortcolor; | |
79 | |
80 private MenuItem sortlast; | |
81 | |
82 private Spinner transportSpinner; | |
83 private TextView quickconnect; | |
84 | |
85 private SharedPreferences prefs = null; | |
86 | |
87 protected boolean makingShortcut = false; | |
88 | |
89 protected Handler updateHandler = new Handler() { | |
90 @Override | |
91 public void handleMessage(Message msg) { | |
92 HostListActivity.this.updateList(); | |
93 } | |
94 }; | |
95 | |
96 private ServiceConnection connection = new ServiceConnection() { | |
97 public void onServiceConnected(ComponentName className, IBinder service) { | |
98 bound = ((TerminalManager.TerminalBinder) service).getService(); | |
99 // 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
|
100 updateList(); |
0 | 101 } |
102 public void onServiceDisconnected(ComponentName className) { | |
103 bound = null; | |
34
75d86b7fd3f0
make hostlist and pubkeylist consistent
Carl Byington <carl@five-ten-sg.com>
parents:
0
diff
changeset
|
104 updateList(); |
0 | 105 } |
106 }; | |
107 | |
108 @Override | |
109 public void onStart() { | |
110 super.onStart(); | |
111 // start the terminal manager service | |
112 this.bindService(new Intent(this, TerminalManager.class), connection, Context.BIND_AUTO_CREATE); | |
113 | |
114 if (this.hostdb == null) | |
115 this.hostdb = new HostDatabase(this); | |
116 } | |
117 | |
118 @Override | |
119 public void onStop() { | |
120 super.onStop(); | |
121 this.unbindService(connection); | |
122 | |
123 if (this.hostdb != null) { | |
124 this.hostdb.close(); | |
125 this.hostdb = null; | |
126 } | |
127 } | |
128 | |
129 @Override | |
130 public void onResume() { | |
131 super.onResume(); | |
132 } | |
133 | |
134 @Override | |
135 protected void onActivityResult(int requestCode, int resultCode, Intent data) { | |
136 if (requestCode == REQUEST_EULA) { | |
137 if (resultCode == Activity.RESULT_OK) { | |
138 // yay they agreed, so store that info | |
139 Editor edit = prefs.edit(); | |
140 edit.putBoolean(PreferenceConstants.EULA, true); | |
141 edit.commit(); | |
142 } | |
143 else { | |
144 // user didnt agree, so close | |
145 this.finish(); | |
146 } | |
147 } | |
148 else if (requestCode == REQUEST_EDIT) { | |
34
75d86b7fd3f0
make hostlist and pubkeylist consistent
Carl Byington <carl@five-ten-sg.com>
parents:
0
diff
changeset
|
149 updateList(); |
0 | 150 } |
151 } | |
152 | |
153 @Override | |
154 public void onCreate(Bundle icicle) { | |
155 super.onCreate(icicle); | |
156 setContentView(R.layout.act_hostlist); | |
157 this.setTitle(String.format("%s: %s", | |
158 getResources().getText(R.string.app_name), | |
159 getResources().getText(R.string.title_hosts_list))); | |
160 this.prefs = PreferenceManager.getDefaultSharedPreferences(this); | |
161 | |
162 // detect HTC Dream and apply special preferences | |
163 if (Build.MANUFACTURER.equals("HTC") && Build.DEVICE.equals("dream")) { | |
164 if (!prefs.contains(PreferenceConstants.SHIFT_FKEYS) && | |
165 !prefs.contains(PreferenceConstants.CTRL_FKEYS)) { | |
166 SharedPreferences.Editor editor = prefs.edit(); | |
167 editor.putBoolean(PreferenceConstants.SHIFT_FKEYS, true); | |
168 editor.putBoolean(PreferenceConstants.CTRL_FKEYS, true); | |
169 editor.commit(); | |
170 } | |
171 } | |
172 | |
173 // check for eula agreement | |
174 boolean agreed = prefs.getBoolean(PreferenceConstants.EULA, false); | |
175 | |
176 if (!agreed) { | |
34
75d86b7fd3f0
make hostlist and pubkeylist consistent
Carl Byington <carl@five-ten-sg.com>
parents:
0
diff
changeset
|
177 startActivityForResult(new Intent(this, WizardActivity.class), REQUEST_EULA); |
0 | 178 } |
179 | |
34
75d86b7fd3f0
make hostlist and pubkeylist consistent
Carl Byington <carl@five-ten-sg.com>
parents:
0
diff
changeset
|
180 makingShortcut = Intent.ACTION_CREATE_SHORTCUT.equals(getIntent().getAction()) |
112
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
35
diff
changeset
|
181 || Intent.ACTION_PICK.equals(getIntent().getAction()); |
0 | 182 // 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
|
183 hostdb = new HostDatabase(this); |
75d86b7fd3f0
make hostlist and pubkeylist consistent
Carl Byington <carl@five-ten-sg.com>
parents:
0
diff
changeset
|
184 updateList(); |
75d86b7fd3f0
make hostlist and pubkeylist consistent
Carl Byington <carl@five-ten-sg.com>
parents:
0
diff
changeset
|
185 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
|
186 registerForContextMenu(getListView()); |
75d86b7fd3f0
make hostlist and pubkeylist consistent
Carl Byington <carl@five-ten-sg.com>
parents:
0
diff
changeset
|
187 getListView().setOnItemClickListener(new OnItemClickListener() { |
112
77ac18bc1b2f
cleanup java formatting
Carl Byington <carl@five-ten-sg.com>
parents:
35
diff
changeset
|
188 |
0 | 189 public synchronized void onItemClick(AdapterView<?> parent, View view, int position, long id) { |
190 // launch off to console details | |
34
75d86b7fd3f0
make hostlist and pubkeylist consistent
Carl Byington <carl@five-ten-sg.com>
parents:
0
diff
changeset
|
191 HostBean host = (HostBean) getListView().getItemAtPosition(position); |
0 | 192 Uri uri = host.getUri(); |
193 Intent contents = new Intent(Intent.ACTION_VIEW, uri); | |
194 contents.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); | |
195 | |
196 if (makingShortcut) { | |
197 // create shortcut if requested | |
198 ShortcutIconResource icon = Intent.ShortcutIconResource.fromContext(HostListActivity.this, R.drawable.icon); | |
199 Intent intent = new Intent(); | |
200 intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, contents); | |
201 intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, host.getNickname()); | |
202 intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon); | |
203 setResult(RESULT_OK, intent); | |
204 finish(); | |
205 } | |
206 else { | |
207 // 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
|
208 startActivity(contents); |
0 | 209 } |
210 } | |
211 }); | |
212 quickconnect = (TextView) this.findViewById(R.id.front_quickconnect); | |
213 quickconnect.setVisibility(makingShortcut ? View.GONE : View.VISIBLE); | |
214 quickconnect.setOnKeyListener(new OnKeyListener() { | |
215 public boolean onKey(View v, int keyCode, KeyEvent event) { | |
216 if (event.getAction() == KeyEvent.ACTION_UP) return false; | |
217 | |
218 if (keyCode != KeyEvent.KEYCODE_ENTER) return false; | |
219 | |
220 return startConsoleActivity(); | |
221 } | |
222 }); | |
223 transportSpinner = (Spinner)findViewById(R.id.transport_selection); | |
224 transportSpinner.setVisibility(makingShortcut ? View.GONE : View.VISIBLE); | |
225 ArrayAdapter<String> transportSelection = new ArrayAdapter<String> (this, | |
226 android.R.layout.simple_spinner_item, TransportFactory.getTransportNames()); | |
227 transportSelection.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); | |
228 transportSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { | |
229 public void onItemSelected(AdapterView<?> arg0, View view, int position, long id) { | |
230 String formatHint = TransportFactory.getFormatHint( | |
231 (String) transportSpinner.getSelectedItem(), | |
232 HostListActivity.this); | |
233 quickconnect.setHint(formatHint); | |
234 quickconnect.setError(null); | |
235 quickconnect.requestFocus(); | |
236 } | |
237 public void onNothingSelected(AdapterView<?> arg0) { } | |
238 }); | |
239 transportSpinner.setAdapter(transportSelection); | |
240 this.inflater = LayoutInflater.from(this); | |
241 } | |
242 | |
243 @Override | |
244 public boolean onPrepareOptionsMenu(Menu menu) { | |
245 super.onPrepareOptionsMenu(menu); | |
246 | |
247 // don't offer menus when creating shortcut | |
248 if (makingShortcut) return true; | |
249 | |
250 sortcolor.setVisible(!sortedByColor); | |
251 sortlast.setVisible(sortedByColor); | |
252 return true; | |
253 } | |
254 | |
255 @Override | |
256 public boolean onCreateOptionsMenu(Menu menu) { | |
257 super.onCreateOptionsMenu(menu); | |
258 | |
259 // don't offer menus when creating shortcut | |
260 if (makingShortcut) return true; | |
261 | |
262 // add host, ssh keys, about | |
263 sortcolor = menu.add(R.string.list_menu_sortcolor); | |
264 sortcolor.setIcon(android.R.drawable.ic_menu_share); | |
265 sortcolor.setOnMenuItemClickListener(new OnMenuItemClickListener() { | |
266 public boolean onMenuItemClick(MenuItem item) { | |
267 sortedByColor = true; | |
268 updateList(); | |
269 return true; | |
270 } | |
271 }); | |
272 sortlast = menu.add(R.string.list_menu_sortname); | |
273 sortlast.setIcon(android.R.drawable.ic_menu_share); | |
274 sortlast.setOnMenuItemClickListener(new OnMenuItemClickListener() { | |
275 public boolean onMenuItemClick(MenuItem item) { | |
276 sortedByColor = false; | |
277 updateList(); | |
278 return true; | |
279 } | |
280 }); | |
281 MenuItem keys = menu.add(R.string.list_menu_pubkeys); | |
282 keys.setIcon(android.R.drawable.ic_lock_lock); | |
283 keys.setIntent(new Intent(HostListActivity.this, PubkeyListActivity.class)); | |
284 MenuItem colors = menu.add(R.string.title_colors); | |
285 colors.setIcon(android.R.drawable.ic_menu_slideshow); | |
286 colors.setIntent(new Intent(HostListActivity.this, ColorsActivity.class)); | |
287 MenuItem settings = menu.add(R.string.list_menu_settings); | |
288 settings.setIcon(android.R.drawable.ic_menu_preferences); | |
289 settings.setIntent(new Intent(HostListActivity.this, SettingsActivity.class)); | |
290 MenuItem help = menu.add(R.string.title_help); | |
291 help.setIcon(android.R.drawable.ic_menu_help); | |
292 help.setIntent(new Intent(HostListActivity.this, HelpActivity.class)); | |
293 return true; | |
294 } | |
295 | |
296 | |
297 @Override | |
298 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { | |
299 // create menu to handle hosts | |
300 // create menu to handle deleting and sharing lists | |
301 AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo; | |
302 final HostBean host = (HostBean) this.getListView().getItemAtPosition(info.position); | |
303 menu.setHeaderTitle(host.getNickname()); | |
304 // edit, disconnect, delete | |
305 MenuItem connect = menu.add(R.string.list_host_disconnect); | |
306 final TerminalBridge bridge = bound.getConnectedBridge(host); | |
307 connect.setEnabled((bridge != null)); | |
308 connect.setOnMenuItemClickListener(new OnMenuItemClickListener() { | |
309 public boolean onMenuItemClick(MenuItem item) { | |
310 bridge.dispatchDisconnect(true); | |
311 updateHandler.sendEmptyMessage(-1); | |
312 return true; | |
313 } | |
314 }); | |
315 MenuItem edit = menu.add(R.string.list_host_edit); | |
316 edit.setOnMenuItemClickListener(new OnMenuItemClickListener() { | |
317 public boolean onMenuItemClick(MenuItem item) { | |
318 Intent intent = new Intent(HostListActivity.this, HostEditorActivity.class); | |
319 intent.putExtra(Intent.EXTRA_TITLE, host.getId()); | |
320 HostListActivity.this.startActivityForResult(intent, REQUEST_EDIT); | |
321 return true; | |
322 } | |
323 }); | |
324 MenuItem portForwards = menu.add(R.string.list_host_portforwards); | |
325 portForwards.setOnMenuItemClickListener(new OnMenuItemClickListener() { | |
326 public boolean onMenuItemClick(MenuItem item) { | |
327 Intent intent = new Intent(HostListActivity.this, PortForwardListActivity.class); | |
328 intent.putExtra(Intent.EXTRA_TITLE, host.getId()); | |
329 HostListActivity.this.startActivityForResult(intent, REQUEST_EDIT); | |
330 return true; | |
331 } | |
332 }); | |
333 | |
334 if (!TransportFactory.canForwardPorts(host.getProtocol())) | |
335 portForwards.setEnabled(false); | |
336 | |
337 MenuItem delete = menu.add(R.string.list_host_delete); | |
338 delete.setOnMenuItemClickListener(new OnMenuItemClickListener() { | |
339 public boolean onMenuItemClick(MenuItem item) { | |
340 // prompt user to make sure they really want this | |
341 new AlertDialog.Builder(HostListActivity.this) | |
342 .setMessage(getString(R.string.delete_message, host.getNickname())) | |
343 .setPositiveButton(R.string.delete_pos, new DialogInterface.OnClickListener() { | |
344 public void onClick(DialogInterface dialog, int which) { | |
345 // make sure we disconnect | |
346 if (bridge != null) | |
347 bridge.dispatchDisconnect(true); | |
348 | |
349 hostdb.deleteHost(host); | |
350 updateHandler.sendEmptyMessage(-1); | |
351 } | |
352 }) | |
353 .setNegativeButton(R.string.delete_neg, null).create().show(); | |
354 return true; | |
355 } | |
356 }); | |
357 } | |
358 | |
359 /** | |
360 * @param text | |
361 * @return | |
362 */ | |
363 private boolean startConsoleActivity() { | |
364 Uri uri = TransportFactory.getUri((String) transportSpinner | |
365 .getSelectedItem(), quickconnect.getText().toString()); | |
366 | |
367 if (uri == null) { | |
368 quickconnect.setError(getString(R.string.list_format_error, | |
369 TransportFactory.getFormatHint( | |
370 (String) transportSpinner.getSelectedItem(), | |
371 HostListActivity.this))); | |
372 return false; | |
373 } | |
374 | |
375 HostBean host = TransportFactory.findHost(hostdb, uri); | |
376 | |
377 if (host == null) { | |
378 host = TransportFactory.getTransport(uri.getScheme()).createHost(uri); | |
379 host.setColor(HostDatabase.COLOR_GRAY); | |
380 host.setPubkeyId(HostDatabase.PUBKEYID_ANY); | |
381 hostdb.saveHost(host); | |
382 } | |
383 | |
384 Intent intent = new Intent(HostListActivity.this, ConsoleActivity.class); | |
385 intent.setData(uri); | |
386 startActivity(intent); | |
387 return true; | |
388 } | |
389 | |
390 protected void updateList() { | |
391 if (prefs.getBoolean(PreferenceConstants.SORT_BY_COLOR, false) != sortedByColor) { | |
392 Editor edit = prefs.edit(); | |
393 edit.putBoolean(PreferenceConstants.SORT_BY_COLOR, sortedByColor); | |
394 edit.commit(); | |
395 } | |
396 | |
397 if (hostdb == null) | |
398 hostdb = new HostDatabase(this); | |
399 | |
400 hosts = hostdb.getHosts(sortedByColor); | |
401 | |
402 // Don't lose hosts that are connected via shortcuts but not in the database. | |
403 if (bound != null) { | |
404 for (TerminalBridge bridge : bound.bridges) { | |
405 if (!hosts.contains(bridge.host)) | |
406 hosts.add(0, bridge.host); | |
407 } | |
408 } | |
409 | |
410 HostAdapter adapter = new HostAdapter(this, hosts, bound); | |
411 this.setListAdapter(adapter); | |
412 } | |
413 | |
414 class HostAdapter extends ArrayAdapter<HostBean> { | |
415 private List<HostBean> hosts; | |
416 private final TerminalManager manager; | |
417 private final ColorStateList red, green, blue; | |
418 | |
419 public final static int STATE_UNKNOWN = 1, STATE_CONNECTED = 2, STATE_DISCONNECTED = 3; | |
420 | |
421 class ViewHolder { | |
422 public TextView nickname; | |
423 public TextView caption; | |
424 public ImageView icon; | |
425 } | |
426 | |
427 public HostAdapter(Context context, List<HostBean> hosts, TerminalManager manager) { | |
428 super(context, R.layout.item_host, hosts); | |
429 this.hosts = hosts; | |
430 this.manager = manager; | |
431 red = context.getResources().getColorStateList(R.color.red); | |
432 green = context.getResources().getColorStateList(R.color.green); | |
433 blue = context.getResources().getColorStateList(R.color.blue); | |
434 } | |
435 | |
436 /** | |
437 * Check if we're connected to a terminal with the given host. | |
438 */ | |
439 private int getConnectedState(HostBean host) { | |
440 // always disconnected if we dont have backend service | |
441 if (this.manager == null) | |
442 return STATE_UNKNOWN; | |
443 | |
444 if (manager.getConnectedBridge(host) != null) | |
445 return STATE_CONNECTED; | |
446 | |
447 if (manager.disconnected.contains(host)) | |
448 return STATE_DISCONNECTED; | |
449 | |
450 return STATE_UNKNOWN; | |
451 } | |
452 | |
453 @Override | |
454 public View getView(int position, View convertView, ViewGroup parent) { | |
455 ViewHolder holder; | |
456 | |
457 if (convertView == null) { | |
458 convertView = inflater.inflate(R.layout.item_host, null, false); | |
459 holder = new ViewHolder(); | |
460 holder.nickname = (TextView)convertView.findViewById(android.R.id.text1); | |
461 holder.caption = (TextView)convertView.findViewById(android.R.id.text2); | |
462 holder.icon = (ImageView)convertView.findViewById(android.R.id.icon); | |
463 convertView.setTag(holder); | |
464 } | |
465 else | |
466 holder = (ViewHolder) convertView.getTag(); | |
467 | |
468 HostBean host = hosts.get(position); | |
469 | |
470 if (host == null) { | |
471 // Well, something bad happened. We can't continue. | |
472 Log.e("HostAdapter", "Host bean is null!"); | |
473 holder.nickname.setText("Error during lookup"); | |
474 holder.caption.setText("see 'adb logcat' for more"); | |
475 return convertView; | |
476 } | |
477 | |
478 holder.nickname.setText(host.getNickname()); | |
479 | |
480 switch (this.getConnectedState(host)) { | |
481 case STATE_UNKNOWN: | |
482 holder.icon.setImageState(new int[] { }, true); | |
483 break; | |
484 | |
485 case STATE_CONNECTED: | |
486 holder.icon.setImageState(new int[] { android.R.attr.state_checked }, true); | |
487 break; | |
488 | |
489 case STATE_DISCONNECTED: | |
490 holder.icon.setImageState(new int[] { android.R.attr.state_expanded }, true); | |
491 break; | |
492 } | |
493 | |
494 ColorStateList chosen = null; | |
495 | |
496 if (HostDatabase.COLOR_RED.equals(host.getColor())) | |
497 chosen = this.red; | |
498 else if (HostDatabase.COLOR_GREEN.equals(host.getColor())) | |
499 chosen = this.green; | |
500 else if (HostDatabase.COLOR_BLUE.equals(host.getColor())) | |
501 chosen = this.blue; | |
502 | |
503 Context context = convertView.getContext(); | |
504 | |
505 if (chosen != null) { | |
506 // set color normally if not selected | |
507 holder.nickname.setTextColor(chosen); | |
508 holder.caption.setTextColor(chosen); | |
509 } | |
510 else { | |
511 // selected, so revert back to default black text | |
512 holder.nickname.setTextAppearance(context, android.R.attr.textAppearanceLarge); | |
513 holder.caption.setTextAppearance(context, android.R.attr.textAppearanceSmall); | |
514 } | |
515 | |
516 long now = System.currentTimeMillis() / 1000; | |
517 String nice = context.getString(R.string.bind_never); | |
518 | |
519 if (host.getLastConnect() > 0) { | |
520 int minutes = (int)((now - host.getLastConnect()) / 60); | |
521 | |
522 if (minutes >= 60) { | |
523 int hours = (minutes / 60); | |
524 | |
525 if (hours >= 24) { | |
526 int days = (hours / 24); | |
527 nice = context.getString(R.string.bind_days, days); | |
528 } | |
529 else | |
530 nice = context.getString(R.string.bind_hours, hours); | |
531 } | |
532 else | |
533 nice = context.getString(R.string.bind_minutes, minutes); | |
534 } | |
535 | |
536 holder.caption.setText(nice); | |
537 return convertView; | |
538 } | |
539 } | |
540 } |