summaryrefslogtreecommitdiff
path: root/src/com/android/terminal/TerminalActivity.java
diff options
context:
space:
mode:
authorJeff Sharkey <jsharkey@android.com>2013-02-23 15:42:10 -0800
committerJeff Sharkey <jsharkey@android.com>2013-02-23 15:48:24 -0800
commitde15e79aadde33fd8c880c19bd4fc6caca0bf795 (patch)
treed6f5867abab2baaf174e2066c5389971c3681e9d /src/com/android/terminal/TerminalActivity.java
parentcedf158c17dc147163734ad1070032ff934d1b2e (diff)
downloadTerminal-de15e79aadde33fd8c880c19bd4fc6caca0bf795.tar.gz
Service to host long-lived terminals, tab UI.
Bind to new TerminalService when UI is running, and keep service started as long as terminals are active. Use ViewPager to show multiple active terminals, and menu items to open/close terminals. Anti-alias terminal text. Reduce callback logging. Add method to stop a running shell; still need to kill child process. Change-Id: I8efcb43aeaf8813762cd0ceebcd5388fc51ebaab
Diffstat (limited to 'src/com/android/terminal/TerminalActivity.java')
-rw-r--r--src/com/android/terminal/TerminalActivity.java141
1 files changed, 136 insertions, 5 deletions
diff --git a/src/com/android/terminal/TerminalActivity.java b/src/com/android/terminal/TerminalActivity.java
index bef1859..99d2be6 100644
--- a/src/com/android/terminal/TerminalActivity.java
+++ b/src/com/android/terminal/TerminalActivity.java
@@ -17,23 +17,154 @@
package com.android.terminal;
import android.app.Activity;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
import android.os.Bundle;
+import android.os.IBinder;
+import android.support.v4.view.PagerAdapter;
+import android.support.v4.view.PagerTitleStrip;
+import android.support.v4.view.ViewPager;
import android.util.Log;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+/**
+ * Activity that displays all {@link Terminal} instances running in a bound
+ * {@link TerminalService}.
+ */
public class TerminalActivity extends Activity {
private static final String TAG = "Terminal";
+ private TerminalService mService;
+
+ private ViewPager mPager;
+ private PagerTitleStrip mTitles;
+
+ private final ServiceConnection mServiceConn = new ServiceConnection() {
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ mService = ((TerminalService.ServiceBinder) service).getService();
+
+ final int size = mService.getTerminals().size();
+ Log.d(TAG, "Bound to service with " + size + " active terminals");
+
+ // Give ourselves at least one terminal session
+ if (size == 0) {
+ mService.createTerminal();
+ }
+
+ // Bind UI to known terminals
+ mTermAdapter.notifyDataSetChanged();
+ }
+
+ @Override
+ public void onServiceDisconnected(ComponentName name) {
+ mService = null;
+ throw new RuntimeException("Service in same process disconnected?");
+ }
+ };
+
+ private final PagerAdapter mTermAdapter = new PagerAdapter() {
+ @Override
+ public int getCount() {
+ if (mService != null) {
+ return mService.getTerminals().size();
+ } else {
+ return 0;
+ }
+ }
+
+ @Override
+ public Object instantiateItem(ViewGroup container, int position) {
+ final Terminal term = mService.getTerminals().get(position);
+ final TerminalView view = new TerminalView(container.getContext());
+ view.setTerminal(term);
+ container.addView(view);
+ return view;
+ }
+
+ @Override
+ public void destroyItem(ViewGroup container, int position, Object object) {
+ final TerminalView view = (TerminalView) object;
+ view.setTerminal(null);
+ container.removeView(view);
+ }
+
+ @Override
+ public int getItemPosition(Object object) {
+ final int index = mService.getTerminals().indexOf(object);
+ if (index == -1) {
+ return POSITION_NONE;
+ } else {
+ return index;
+ }
+ }
+
+ @Override
+ public boolean isViewFromObject(View view, Object object) {
+ return view == object;
+ }
+
+ @Override
+ public CharSequence getPageTitle(int position) {
+ return mService.getTerminals().get(position).getTitle();
+ }
+ };
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- final Terminal term = new Terminal();
- term.start();
+ setContentView(R.layout.activity);
+
+ mPager = (ViewPager) findViewById(R.id.pager);
+ mTitles = (PagerTitleStrip) findViewById(R.id.titles);
+
+ mPager.setAdapter(mTermAdapter);
+ }
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+ bindService(
+ new Intent(this, TerminalService.class), mServiceConn, Context.BIND_AUTO_CREATE);
+ }
- final TerminalView view = new TerminalView(this, term);
+ @Override
+ protected void onStop() {
+ super.onStop();
+ unbindService(mServiceConn);
+ }
- setContentView(view);
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ getMenuInflater().inflate(R.menu.activity, menu);
+ return true;
+ }
- Log.d(TAG, "Rows: " + term.getRows());
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.menu_new_tab: {
+ mService.createTerminal();
+ mTermAdapter.notifyDataSetChanged();
+ final int index = mService.getTerminals().size() - 1;
+ mPager.setCurrentItem(index, true);
+ return true;
+ }
+ case R.id.menu_close_tab: {
+ final int index = mPager.getCurrentItem();
+ final Terminal term = mService.getTerminals().get(index);
+ mService.destroyTerminal(term);
+ // TODO: ask adamp about buggy zero item behavior
+ mTermAdapter.notifyDataSetChanged();
+ return true;
+ }
+ }
+ return false;
}
}