diff options
Diffstat (limited to 'src/org/theb/ssh/HostsList.java')
-rw-r--r-- | src/org/theb/ssh/HostsList.java | 213 |
1 files changed, 213 insertions, 0 deletions
diff --git a/src/org/theb/ssh/HostsList.java b/src/org/theb/ssh/HostsList.java new file mode 100644 index 0000000..7a35fe2 --- /dev/null +++ b/src/org/theb/ssh/HostsList.java @@ -0,0 +1,213 @@ +package org.theb.ssh; + +import org.theb.provider.HostDb; +import android.app.ListActivity; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.database.Cursor; +import android.graphics.drawable.Drawable; +import android.net.ContentURI; +import android.os.Bundle; +import android.view.KeyEvent; +import android.view.Menu; +import android.view.View; +import android.view.View.MeasureSpec; +import android.widget.ListAdapter; +import android.widget.ListView; +import android.widget.SimpleCursorAdapter; +import android.widget.TextView; + +public class HostsList extends ListActivity { + public static final int DELETE_ID = Menu.FIRST; + public static final int INSERT_ID = Menu.FIRST + 1; + + private static final String[] PROJECTION = new String[] { + HostDb.Hosts._ID, + HostDb.Hosts.HOSTNAME, + HostDb.Hosts.USERNAME, + HostDb.Hosts.PORT, + }; + + private Cursor mCursor; + + public class HostListCursorAdapter extends SimpleCursorAdapter { + + public HostListCursorAdapter(Context context, int layout, Cursor c, + String[] from, int[] to) { + super(context, layout, c, from, to); + } + + @Override + public void bindView(View view, Context context, Cursor cursor) { + String label; + TextView textView = (TextView) view; + + // Create a list display of "username@hostname:port" but exclude the port if + // it is already port 22 (default secure shell port). + label = cursor.getString(2) + + "@" + + cursor.getString(1); + + int port = cursor.getInt(3); + if (port != 22) { + label = label + ":" + String.valueOf(port); + } + + textView.setText(label); + } + + } + + /** Called when the activity is first created. */ + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + + this.setDefaultKeyMode(SHORTCUT_DEFAULT_KEYS); + + Intent intent = getIntent(); + if (intent.getData() == null) { + intent.setData(HostDb.Hosts.CONTENT_URI); + } + + setupListStripes(); + + mCursor = managedQuery(getIntent().getData(), PROJECTION, null, null); + + ListAdapter adapter = new HostListCursorAdapter(this, + android.R.layout.simple_list_item_1, mCursor, + new String[] {HostDb.Hosts.HOSTNAME}, new int[] {android.R.id.text1}); + + setListAdapter(adapter); + } + + /** + * Add stripes to the list view. + */ + private void setupListStripes() { + // Get Drawables for alternating stripes + Drawable[] lineBackgrounds = new Drawable[2]; + + lineBackgrounds[0] = getResources().getDrawable(R.drawable.even_stripe); + lineBackgrounds[1] = getResources().getDrawable(R.drawable.odd_stripe); + + // Make and measure a sample TextView of the sort our adapter will + // return + View view = getViewInflate().inflate( + android.R.layout.simple_list_item_1, null, null); + + TextView v = (TextView) view.findViewById(android.R.id.text1); + v.setText("X"); + // Make it 100 pixels wide, and let it choose its own height. + v.measure(MeasureSpec.makeMeasureSpec(View.MeasureSpec.EXACTLY, 100), + MeasureSpec.makeMeasureSpec(View.MeasureSpec.UNSPECIFIED, 0)); + int height = v.getMeasuredHeight(); + getListView().setStripes(lineBackgrounds, height); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + super.onCreateOptionsMenu(menu); + + // This is our one standard application action -- inserting a + // new note into the list. + menu.add(0, INSERT_ID, R.string.menu_insert).setShortcut( + KeyEvent.KEYCODE_3, 0, KeyEvent.KEYCODE_A); + + // Generate any additional actions that can be performed on the + // overall list. In a normal install, there are no additional + // actions found here, but this allows other applications to extend + // our menu with their own actions. + Intent intent = new Intent(null, getIntent().getData()); + intent.addCategory(Intent.ALTERNATIVE_CATEGORY); + menu.addIntentOptions( + Menu.ALTERNATIVE, 0, new ComponentName(this, HostsList.class), + null, intent, 0, null); + + return true; + } + + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + super.onPrepareOptionsMenu(menu); + final boolean haveItems = mCursor.count() > 0; + + // If there are any notes in the list (which implies that one of + // them is selected), then we need to generate the actions that + // can be performed on the current selection. This will be a combination + // of our own specific actions along with any extensions that can be + // found. + if (haveItems) { + // This is the selected item. + ContentURI uri = getIntent().getData().addId(getSelectionRowID()); + + // Build menu... always starts with the CONNECT action... + Intent[] specifics = new Intent[1]; + specifics[0] = new Intent(Intent.PICK_ACTION, uri); + Menu.Item[] items = new Menu.Item[1]; + + // ... is followed by whatever other actions are available... + Intent intent = new Intent(null, uri); + intent.addCategory(Intent.SELECTED_ALTERNATIVE_CATEGORY); + menu.addIntentOptions(Menu.SELECTED_ALTERNATIVE, 0, null, specifics, + intent, Menu.NO_SEPARATOR_AFTER, items); + + // ... and ends with the delete command. + menu.add(Menu.SELECTED_ALTERNATIVE, DELETE_ID, R.string.menu_delete) +. + setShortcut(KeyEvent.KEYCODE_2, 0, KeyEvent.KEYCODE_D); + menu.addSeparator(Menu.SELECTED_ALTERNATIVE, 0); + + // Give a shortcut to the connect action. + if (items[0] != null) { + items[0].setShortcut(KeyEvent.KEYCODE_1, 0, KeyEvent.KEYCODE_C); + } + } else { + menu.removeGroup(Menu.SELECTED_ALTERNATIVE); + } + + // Make sure the delete action is disabled if there are no items. + menu.setItemShown(DELETE_ID, haveItems); + return true; + } + + @Override + public boolean onOptionsItemSelected(Menu.Item item) { + switch (item.getId()) { + case DELETE_ID: + deleteItem(); + return true; + case INSERT_ID: + insertItem(); + return true; + } + return super.onOptionsItemSelected(item); + } + + @Override + protected void onListItemClick(ListView l, View v, int position, long id) { + ContentURI url = getIntent().getData().addId(getSelectionRowID()); + + String action = getIntent().getAction(); + if (Intent.PICK_ACTION.equals(action) + || Intent.GET_CONTENT_ACTION.equals(action)) { + // The caller is waiting for us to return a note selected by + // the user. The have clicked on one, so return it now. + setResult(RESULT_OK, url.toString()); + } else { + // Launch activity to view/edit the currently selected item + startActivity(new Intent(Intent.PICK_ACTION, url)); + } + } + + private final void deleteItem() { + mCursor.moveTo(getSelection()); + mCursor.deleteRow(); + } + + private final void insertItem() { + // Launch activity to insert a new item + startActivity(new Intent(Intent.INSERT_ACTION, getIntent().getData())); + } +}
\ No newline at end of file |