aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/org/connectbot/HostListActivity.java
diff options
context:
space:
mode:
authorRyan Hansberry <rhansby@gmail.com>2015-09-22 10:41:37 -0700
committerRyan Hansberry <rhansby@gmail.com>2015-09-22 11:59:13 -0700
commit0f293ab7927470ab3a2d78064cc3c66e2523415f (patch)
tree0f503c5f09b19df25d9ec7799ac542ea866792d4 /app/src/main/java/org/connectbot/HostListActivity.java
parentd2164043d4748b0269937cb983929c6c2e8c6fff (diff)
downloadconnectbot-0f293ab7927470ab3a2d78064cc3c66e2523415f.tar.gz
connectbot-0f293ab7927470ab3a2d78064cc3c66e2523415f.tar.bz2
connectbot-0f293ab7927470ab3a2d78064cc3c66e2523415f.zip
Convert PubkeyListActivity, PortFowardListActivity, and HostListActivity to AppCompat, using AppCompatListActivity superclass
Diffstat (limited to 'app/src/main/java/org/connectbot/HostListActivity.java')
-rw-r--r--app/src/main/java/org/connectbot/HostListActivity.java321
1 files changed, 125 insertions, 196 deletions
diff --git a/app/src/main/java/org/connectbot/HostListActivity.java b/app/src/main/java/org/connectbot/HostListActivity.java
index 4dfeffd..41ba62b 100644
--- a/app/src/main/java/org/connectbot/HostListActivity.java
+++ b/app/src/main/java/org/connectbot/HostListActivity.java
@@ -17,15 +17,6 @@
package org.connectbot;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.support.annotation.VisibleForTesting;
-import android.support.v7.app.AppCompatActivity;
-import android.support.v7.widget.LinearLayoutManager;
-import android.support.v7.widget.RecyclerView;
-
import java.util.List;
import org.connectbot.bean.HostBean;
@@ -52,6 +43,9 @@ import android.os.Bundle;
import android.os.IBinder;
import android.preference.PreferenceManager;
import android.support.annotation.StyleRes;
+import android.support.annotation.VisibleForTesting;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
import android.text.format.DateUtils;
import android.util.Log;
import android.view.ContextMenu;
@@ -69,7 +63,7 @@ import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;
-public class HostListActivity extends AppCompatActivity implements OnHostStatusChangedListener {
+public class HostListActivity extends AppCompatListActivity implements OnHostStatusChangedListener {
public final static String TAG = "CB.HostListActivity";
public static final String DISCONNECT_ACTION = "org.connectbot.action.DISCONNECT";
@@ -81,10 +75,6 @@ public class HostListActivity extends AppCompatActivity implements OnHostStatusC
private List<HostBean> hosts;
protected LayoutInflater inflater = null;
- private RecyclerView mHostListView;
- private HostAdapter mAdapter;
- private View mEmptyView;
-
protected boolean sortedByColor = false;
private MenuItem sortcolor;
@@ -182,10 +172,10 @@ public class HostListActivity extends AppCompatActivity implements OnHostStatusC
super.onCreate(icicle);
setContentView(R.layout.act_hostlist);
- mHostListView = (RecyclerView) findViewById(R.id.list);
- mHostListView.setHasFixedSize(true);
- mHostListView.setLayoutManager(new LinearLayoutManager(this));
- mHostListView.addItemDecoration(new HostListItemDecoration(this));
+ mListView = (RecyclerView) findViewById(R.id.list);
+ mListView.setHasFixedSize(true);
+ mListView.setLayoutManager(new LinearLayoutManager(this));
+ mListView.addItemDecoration(new ListItemDecoration(this));
mEmptyView = findViewById(R.id.empty);
@@ -222,7 +212,7 @@ public class HostListActivity extends AppCompatActivity implements OnHostStatusC
this.sortedByColor = prefs.getBoolean(PreferenceConstants.SORT_BY_COLOR, false);
- this.registerForContextMenu(mHostListView);
+ this.registerForContextMenu(mListView);
quickconnect = (TextView) this.findViewById(R.id.front_quickconnect);
quickconnect.setVisibility(makingShortcut ? View.GONE : View.VISIBLE);
@@ -356,7 +346,6 @@ public class HostListActivity extends AppCompatActivity implements OnHostStatusC
}).create().show();
}
-
/**
* @return
*/
@@ -411,7 +400,7 @@ public class HostListActivity extends AppCompatActivity implements OnHostStatusC
}
mAdapter = new HostAdapter(this, hosts, bound);
- mHostListView.setAdapter(mAdapter);
+ mListView.setAdapter(mAdapter);
adjustViewVisibility();
}
@@ -420,136 +409,122 @@ public class HostListActivity extends AppCompatActivity implements OnHostStatusC
updateList();
}
- /**
- * If the host list is empty, hides the list and shows the empty message; otherwise, shows
- * the list and hides the empty message.
- */
- private void adjustViewVisibility() {
- boolean isEmpty = mAdapter.getItemCount() == 0;
- mHostListView.setVisibility(isEmpty ? View.GONE : View.VISIBLE);
- mEmptyView.setVisibility(isEmpty ? View.VISIBLE : View.GONE);
- }
+ private class HostViewHolder extends ItemViewHolder {
+ public final ImageView icon;
+ public final TextView nickname;
+ public final TextView caption;
- @VisibleForTesting
- protected class HostAdapter extends RecyclerView.Adapter<HostAdapter.ViewHolder> {
- private final LayoutInflater inflater;
- private final List<HostBean> hosts;
- private final TerminalManager manager;
- private final Context context;
+ public HostBean host;
- public final static int STATE_UNKNOWN = 1, STATE_CONNECTED = 2, STATE_DISCONNECTED = 3;
+ public HostViewHolder(View v) {
+ super(v);
- class ViewHolder extends RecyclerView.ViewHolder
- implements View.OnClickListener, View.OnCreateContextMenuListener {
- public final ImageView icon;
- public final TextView nickname;
- public final TextView caption;
- public HostBean host;
-
- public ViewHolder(View v) {
- super(v);
- v.setOnClickListener(this);
- v.setOnCreateContextMenuListener(this);
-
- icon = (ImageView) v.findViewById(android.R.id.icon);
- nickname = (TextView) v.findViewById(android.R.id.text1);
- caption = (TextView) v.findViewById(android.R.id.text2);
- }
+ icon = (ImageView) v.findViewById(android.R.id.icon);
+ nickname = (TextView) v.findViewById(android.R.id.text1);
+ caption = (TextView) v.findViewById(android.R.id.text2);
+ }
- @Override
- public void onClick(View v) {
- // launch off to console details
- Uri uri = host.getUri();
+ @Override
+ public void onClick(View v) {
+ // launch off to console details
+ Uri uri = host.getUri();
- Intent contents = new Intent(Intent.ACTION_VIEW, uri);
- contents.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ Intent contents = new Intent(Intent.ACTION_VIEW, uri);
+ contents.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
- if (makingShortcut) {
- // create shortcut if requested
- ShortcutIconResource icon = Intent.ShortcutIconResource.fromContext(
- HostListActivity.this, R.drawable.icon);
+ if (makingShortcut) {
+ // create shortcut if requested
+ ShortcutIconResource icon = Intent.ShortcutIconResource.fromContext(
+ HostListActivity.this, R.drawable.icon);
- Intent intent = new Intent();
- intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, contents);
- intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, host.getNickname());
- intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon);
+ Intent intent = new Intent();
+ intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, contents);
+ intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, host.getNickname());
+ intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon);
- setResult(RESULT_OK, intent);
- finish();
+ setResult(RESULT_OK, intent);
+ finish();
- } else {
- // otherwise just launch activity to show this host
- contents.setClass(HostListActivity.this, ConsoleActivity.class);
- HostListActivity.this.startActivity(contents);
- }
+ } else {
+ // otherwise just launch activity to show this host
+ contents.setClass(HostListActivity.this, ConsoleActivity.class);
+ HostListActivity.this.startActivity(contents);
}
+ }
- @Override
- public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
- menu.setHeaderTitle(host.getNickname());
-
- // edit, disconnect, delete
- MenuItem connect = menu.add(R.string.list_host_disconnect);
- final TerminalBridge bridge = (bound == null) ? null : bound.getConnectedBridge(host);
- connect.setEnabled(bridge != null);
- connect.setOnMenuItemClickListener(new OnMenuItemClickListener() {
- public boolean onMenuItemClick(MenuItem item) {
- bridge.dispatchDisconnect(true);
- return true;
- }
- });
-
- MenuItem edit = menu.add(R.string.list_host_edit);
- edit.setOnMenuItemClickListener(new OnMenuItemClickListener() {
- public boolean onMenuItemClick(MenuItem item) {
- Intent intent = new Intent(HostListActivity.this, HostEditorActivity.class);
- intent.putExtra(Intent.EXTRA_TITLE, host.getId());
- HostListActivity.this.startActivityForResult(intent, REQUEST_EDIT);
- return true;
- }
- });
-
- MenuItem portForwards = menu.add(R.string.list_host_portforwards);
- portForwards.setOnMenuItemClickListener(new OnMenuItemClickListener() {
- public boolean onMenuItemClick(MenuItem item) {
- Intent intent = new Intent(HostListActivity.this, PortForwardListActivity.class);
- intent.putExtra(Intent.EXTRA_TITLE, host.getId());
- HostListActivity.this.startActivityForResult(intent, REQUEST_EDIT);
- return true;
- }
- });
- if (!TransportFactory.canForwardPorts(host.getProtocol()))
- portForwards.setEnabled(false);
-
- MenuItem delete = menu.add(R.string.list_host_delete);
- delete.setOnMenuItemClickListener(new OnMenuItemClickListener() {
- public boolean onMenuItemClick(MenuItem item) {
- // prompt user to make sure they really want this
- new AlertDialog.Builder(HostListActivity.this)
- .setMessage(getString(R.string.delete_message, host.getNickname()))
- .setPositiveButton(R.string.delete_pos, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- // make sure we disconnect
- if (bridge != null)
- bridge.dispatchDisconnect(true);
-
- hostdb.deleteHost(host);
- updateList();
- }
- })
- .setNegativeButton(R.string.delete_neg, null).create().show();
-
- return true;
- }
- });
- }
+ @Override
+ public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
+ menu.setHeaderTitle(host.getNickname());
+
+ // edit, disconnect, delete
+ MenuItem connect = menu.add(R.string.list_host_disconnect);
+ final TerminalBridge bridge = (bound == null) ? null : bound.getConnectedBridge(host);
+ connect.setEnabled(bridge != null);
+ connect.setOnMenuItemClickListener(new OnMenuItemClickListener() {
+ public boolean onMenuItemClick(MenuItem item) {
+ bridge.dispatchDisconnect(true);
+ return true;
+ }
+ });
+
+ MenuItem edit = menu.add(R.string.list_host_edit);
+ edit.setOnMenuItemClickListener(new OnMenuItemClickListener() {
+ public boolean onMenuItemClick(MenuItem item) {
+ Intent intent = new Intent(HostListActivity.this, HostEditorActivity.class);
+ intent.putExtra(Intent.EXTRA_TITLE, host.getId());
+ HostListActivity.this.startActivityForResult(intent, REQUEST_EDIT);
+ return true;
+ }
+ });
+
+ MenuItem portForwards = menu.add(R.string.list_host_portforwards);
+ portForwards.setOnMenuItemClickListener(new OnMenuItemClickListener() {
+ public boolean onMenuItemClick(MenuItem item) {
+ Intent intent = new Intent(HostListActivity.this, PortForwardListActivity.class);
+ intent.putExtra(Intent.EXTRA_TITLE, host.getId());
+ HostListActivity.this.startActivityForResult(intent, REQUEST_EDIT);
+ return true;
+ }
+ });
+ if (!TransportFactory.canForwardPorts(host.getProtocol()))
+ portForwards.setEnabled(false);
+
+ MenuItem delete = menu.add(R.string.list_host_delete);
+ delete.setOnMenuItemClickListener(new OnMenuItemClickListener() {
+ public boolean onMenuItemClick(MenuItem item) {
+ // prompt user to make sure they really want this
+ new AlertDialog.Builder(HostListActivity.this)
+ .setMessage(getString(R.string.delete_message, host.getNickname()))
+ .setPositiveButton(R.string.delete_pos, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ // make sure we disconnect
+ if (bridge != null)
+ bridge.dispatchDisconnect(true);
+
+ hostdb.deleteHost(host);
+ updateList();
+ }
+ })
+ .setNegativeButton(R.string.delete_neg, null).create().show();
+
+ return true;
+ }
+ });
}
+ }
+
+ @VisibleForTesting
+ private class HostAdapter extends ItemAdapter {
+ private final List<HostBean> hosts;
+ private final TerminalManager manager;
+
+ public final static int STATE_UNKNOWN = 1, STATE_CONNECTED = 2, STATE_DISCONNECTED = 3;
public HostAdapter(Context context, List<HostBean> hosts, TerminalManager manager) {
- this.context = context;
+ super(context);
+
this.hosts = hosts;
this.manager = manager;
- this.inflater = LayoutInflater.from(context);
}
/**
@@ -570,36 +545,38 @@ public class HostListActivity extends AppCompatActivity implements OnHostStatusC
}
@Override
- public HostAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ public HostViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_host, parent, false);
- ViewHolder vh = new ViewHolder(v);
+ HostViewHolder vh = new HostViewHolder(v);
return vh;
}
@Override
- public void onBindViewHolder(ViewHolder holder, int position) {
+ public void onBindViewHolder(ItemViewHolder holder, int position) {
+ HostViewHolder hostHolder = (HostViewHolder) holder;
+
HostBean host = hosts.get(position);
if (host == null) {
// Well, something bad happened. We can't continue.
Log.e("HostAdapter", "Host bean is null!");
- holder.nickname.setText("Error during lookup");
- holder.caption.setText("see 'adb logcat' for more");
+ hostHolder.nickname.setText("Error during lookup");
+ hostHolder.caption.setText("see 'adb logcat' for more");
}
- holder.host = host;
+ hostHolder.host = host;
- holder.nickname.setText(host.getNickname());
+ hostHolder.nickname.setText(host.getNickname());
switch (this.getConnectedState(host)) {
case STATE_UNKNOWN:
- holder.icon.setImageState(new int[] { }, true);
+ hostHolder.icon.setImageState(new int[] { }, true);
break;
case STATE_CONNECTED:
- holder.icon.setImageState(new int[] { android.R.attr.state_checked }, true);
+ hostHolder.icon.setImageState(new int[] { android.R.attr.state_checked }, true);
break;
case STATE_DISCONNECTED:
- holder.icon.setImageState(new int[] { android.R.attr.state_expanded }, true);
+ hostHolder.icon.setImageState(new int[] { android.R.attr.state_expanded }, true);
break;
}
@@ -619,19 +596,15 @@ public class HostListActivity extends AppCompatActivity implements OnHostStatusC
chosenStyleSecondLine = R.style.ListItemSecondLineText;
}
- holder.nickname.setTextAppearance(context, chosenStyleFirstLine);
- holder.caption.setTextAppearance(context, chosenStyleSecondLine);
+ hostHolder.nickname.setTextAppearance(context, chosenStyleFirstLine);
+ hostHolder.caption.setTextAppearance(context, chosenStyleSecondLine);
CharSequence nice = context.getString(R.string.bind_never);
if (host.getLastConnect() > 0) {
nice = DateUtils.getRelativeTimeSpanString(host.getLastConnect() * 1000);
}
- holder.caption.setText(nice);
- }
-
- public HostBean getItem(int position) {
- return hosts.get(position);
+ hostHolder.caption.setText(nice);
}
@Override
@@ -644,48 +617,4 @@ public class HostListActivity extends AppCompatActivity implements OnHostStatusC
return hosts.size();
}
}
-
- /**
- * Item decorations for host list items, which adds a divider between items and leaves a
- * small offset at the top of the list to adhere to the Material Design spec.
- */
- private class HostListItemDecoration extends RecyclerView.ItemDecoration {
- private final int[] ATTRS = new int[]{
- android.R.attr.listDivider
- };
-
- private final int TOP_LIST_OFFSET = 8;
-
- private Drawable mDivider;
-
- public HostListItemDecoration(Context c) {
- final TypedArray a = c.obtainStyledAttributes(ATTRS);
- mDivider = a.getDrawable(0);
- a.recycle();
- }
-
- @Override
- public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
- final int left = parent.getPaddingLeft();
- final int right = parent.getWidth() - parent.getPaddingRight();
-
- final int childCount = parent.getChildCount();
- for (int i = 0; i < childCount; i++) {
- final View child = parent.getChildAt(i);
- final RecyclerView.LayoutParams params =
- (RecyclerView.LayoutParams) child.getLayoutParams();
- final int top = child.getBottom() + params.bottomMargin;
- final int bottom = top + mDivider.getIntrinsicHeight();
- mDivider.setBounds(left, top, right, bottom);
- mDivider.draw(c);
- }
- }
-
- @Override
- public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
- RecyclerView.State state) {
- int top = parent.getChildAdapterPosition(view) == 0 ? TOP_LIST_OFFSET : 0;
- outRect.set(0, top, 0, mDivider.getIntrinsicHeight());
- }
- }
}